【发布时间】:2016-10-04 05:55:12
【问题描述】:
我正在使用一个名为 indata 的双精度数组(在堆中,使用 malloc 分配)和一个名为 sum 的本地双精度。
我写了两个不同的函数来比较indata中的值,得到了不同的结果。最终,我确定差异是由于一个函数在条件测试中使用了表达式,而另一个函数在同一条件测试中使用了局部变量。我希望这些是等价的。
我的函数 A 使用:
if (indata[i]+indata[j] > max) hi++;
我的函数 B 使用:
sum = indata[i]+indata[j];
if (sum>max) hi++;
在通过相同的数据集和max 之后,我最终得到不同的hi 值,具体取决于我使用的函数。我相信功能 B 是正确的,而功能 A 具有误导性。同样,当我尝试下面的 sn-p 时
sum = indata[i]+indata[j];
if ((indata[i]+indata[j]) != sum) etc.
该条件将评估为真。
虽然我知道浮点数不一定能提供精确的表示,但为什么当作为表达式评估而不是存储在变量中时,这种不精确的表示会发生变化?推荐的最佳做法是在条件之前始终评估这样的双重表达式吗?谢谢!
【问题讨论】:
-
这基本上是因为计算机不能完全精确地表示数字。了解浮点数。
-
@iharob 他在最后一段中承认了这一点。但它并没有解释为什么它会根据您是否将结果分配给变量而有所不同。
-
在 B 中进行赋值时,需要将值四舍五入到最接近的
double值(通常为 64 位)。在函数 A 中,条件表达式可以使用更高的精度(例如 80 位)进行计算。 -
@user3386109:如果代码确实是针对 x86 而不是 x86-64 编译的,因此它使用 x87 而不是 SSE 浮点指令,那么这确实是最可能的解释。
标签: c syntax floating-point expression floating-accuracy