我在“Ask Ubuntu”论坛上问了以下问题,并被告知该问题不适合该论坛。有人建议我在这里问我的问题。如果这不是这个问题的合适地点,我提前道歉。
我目前使用 java 作为我的默认语言。另外,我目前正在运行 Kubuntu 12.04 版。我正在将 c++ 程序转换为 java,而 java 程序的结果与 c++ 程序的结果不匹配。当我意识到 java 程序产生了正确的结果而 c++ 程序没有产生正确的结果时,我开始四处寻找问题。我的问题是任何人都可以解释为什么 c++ 会产生错误的结果并且可以修复吗?
我写了两个最小的程序来说明这个问题。我还编写了一个脚本文件来显示这两个程序,编译并运行它们。结果如下。很明显,有效数字在同一个邻域中,但是在处理 10 的大幂(例如 30 次幂)时,差异是显着的。以下是我的测试程序和脚本的结果:
Linux Pegasus 3.2.0-54-generic #82-Ubuntu SMP Tue Sep 10 20:08:42 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
c++源代码
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
double testValue;
//---------------------------------------------------------------------
testValue = 1.0e0 * 1.9891e30;
cout << scientific << showpoint << right << setprecision(20)
<< "The test value = "
<< setw(25) << testValue
<< " the test value should be 1.9891e30\n"
<< endl;
return 0;
}
java源码
class test
{
public static void main (String[] args)
{
double testValue;
//---------------------------------------------------------------------
testValue = 1.0e0 * 1.9891e30;
System.out.format
(
"The test value = %.20e the test value should be 1.9891e30%n", testValue
);
} // end main
}
g++ 测试
测试值 = 1.98909999999999988781e+30 测试值应该是 1.9891e30
java测试
测试值 = 1.98910000000000000000e+30 测试值应该是 1.9891e30
显然 c++ 程序产生的 testValue 的值是错误的,而 java 程序产生的 testValue 的值是正确的。对此问题的任何和所有见解将不胜感激。我已经使用搜索词“c++ 错误计算”搜索了谷歌和这里,但没有任何重要发现。