运行与.NET 中的双乘法是否损坏有关的快速实验?并阅读了几篇关于 C# 字符串格式的文章,我认为:
{
double i = 10 * 0.69;
Console.WriteLine(i);
Console.WriteLine(String.Format(" {0:F20}", i));
Console.WriteLine(String.Format("+ {0:F20}", 6.9 - i));
Console.WriteLine(String.Format("= {0:F20}", 6.9));
}
将是此 C 代码的 C# 等效项:
{
double i = 10 * 0.69;
printf ( "%f\n", i );
printf ( " %.20f\n", i );
printf ( "+ %.20f\n", 6.9 - i );
printf ( "= %.20f\n", 6.9 );
}
但是 C# 产生输出:
6.9
6.90000000000000000000
+ 0.00000000000000088818
= 6.90000000000000000000
尽管我在调试器中显示的值等于 6.89999999999999946709(而不是 6.9)。
与显示格式要求的精度的 C 相比:
6.900000
6.89999999999999946709
+ 0.00000000000000088818
= 6.90000000000000035527
这是怎么回事?
(Microsoft .NET Framework 版本 3.51 SP1 / Visual Studio C# 2008 速成版)
我有数值计算的背景和在各种平台上实施区间算术的经验 - 一种由于复杂数值系统的精度限制而估计误差的技术。要获得赏金,请不要尝试解释存储精度 - 在这种情况下,它是 64 位双精度 ULP 的差异。
为了获得赏金,我想知道 .Net 如何(或是否)可以将 double 格式化为 C 代码中可见的请求精度。