Ric*_*gan 7 c# math floating-point
我在字典中存储双打时看到了一些奇怪的东西,我对此感到困惑.
这是代码:
Dictionary<string, double> a = new Dictionary<string, double>();
a.Add("a", 1e-3);
if (1.0 < a["a"] * 1e3)
Console.WriteLine("Wrong");
if (1.0 < 1e-3 * 1e3)
Console.WriteLine("Wrong");
Run Code Online (Sandbox Code Playgroud)
第二个if语句按预期工作; 1.0不小于1.0.现在,第一个if语句的计算结果为true.非常奇怪的是,当我将鼠标悬停在if上时,intellisense告诉我错误,但代码很高兴地移动到Console.WriteLine.
这适用于Visual Studio 2008中的C#3.5.
这是浮点精度问题吗?那为什么第二个if语句有效呢?我觉得我在这里缺少一些非常基本的东西.
任何见解都表示赞赏.
Edit2(重新提出问题):
我可以接受数学精度问题,但我现在的问题是:为什么悬停过度评估正确?中间窗口也是如此.我将第一个if语句中的代码粘贴到中间窗口中,并评估为false.
更新
首先,非常感谢所有伟大的答案.
我也在同一台机器上的另一个项目中重新创建这个问题.看看项目设置,我看不出任何差异.看看项目之间的IL,我认为没有差异.看看反汇编,我发现没有明显的差异(除了内存地址).然而,当我调试原始项目时,我看到: 问题的截图http://i30.tinypic.com/ega874.png
即时窗口告诉我if是否为false,但代码属于条件.
无论如何,我认为最好的答案是在这些情况下为浮点运算做准备.我不能放弃这个的原因更多的是调试器的计算与运行时的不同.非常感谢Brian Gideon和stephentyrone的一些非常有见地的评论.
not*_*row 13
这是浮动精度问题.
第二个语句有效,因为编译器在发出.exe之前计算表达式1e-3*1e3.
在ILDasm/Reflector中查找它会发出类似的东西
if (1.0 < 1.0)
Console.WriteLine("Wrong");
Run Code Online (Sandbox Code Playgroud)