【发布时间】:2012-04-29 08:25:32
【问题描述】:
为什么这是真的?与 C 甚至 Java Math.pow 方法相比,Java 在将两个浮点数相乘时产生的结果似乎略有差异。
Java:
float a = 0.88276923;
double b = a * a; // b becomes 0.779281497001648 <---- what???
b = Math.pow(a,2); // b becomes 0.7792815081874238
C:
float a = 0.88276923;
double b = a * a; // b becomes 0.7792815081874238
pow(a,2); // b becomes 0.7792815081874238
更新:根据 Ed S. 的评论,我还发现 C 行为会因编译器而异。使用 gcc 它似乎与 Java 行为相匹配。使用 Visual Studio(取决于您的目标平台)它可以产生上面看到的结果或在 Java 中看到的结果。呃。
【问题讨论】:
-
啊,浮点运算。准确性和可靠性的纯粹堡垒。
-
我知道浮点数并不精确。但是,我希望它们的不精确性是一致的。
-
您没有使用 C++ 编译器编译 C 代码,因此使用了
float的重载版本pow是吗?float pow(float base, float exponent) -
我使用 VS2005 进行了测试,C 结果是相同的(实际上是使用 C89 编译器)......直到我以 x64 为目标,在这种情况下,
fld指令被删除以支持@ 987654329@ 你得到了 java 行为。哦,编程的乐趣。
标签: java c floating-point floating-accuracy