运行与.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 Express Edition)
我有数值计算方面的经验,并且在各种平台上实现间隔算术(一种用于估计由于复杂数值系统中的精度限制而导致的误差的技术)的经验。为了获得奖励,请不要尝试说明存储精度-在这种情况下,这是64位双精度ULP的区别。
为了获得赏金,我想知道.Net如何(或是否)可以将C格式的double格式化为所需的精度。
HUWWW
湖上湖
红颜莎娜
相关分类