「Ask Ubuntu」フォーラムで次の質問をしたところ、その質問はそのフォーラムには不適切だと言われました。ここで質問するように言われました。これがこの質問の適切な場所でない場合は、事前にお詫び申し上げます。
現在、Java をデフォルト言語として使用しています。また、現在 Kubuntu バージョン 12.04 を実行しています。C++ プログラムを Java に変換していましたが、Java プログラムの結果が C++ プログラムの結果と一致しませんでした。Java プログラムが正しい結果を生成し、c++ プログラムが正しい結果を生成していないことに気付いたとき、私は問題を探し始めました。私の質問は、なぜ c++ が誤った結果を生成するのか、それを修正できるのかを説明できる人はいますか?
この問題を説明するために、2 つの最小限のプログラムを作成しました。また、2 つのプログラムを表示し、コンパイルして実行するためのスクリプト ファイルも作成しました。結果は以下のとおりです。明らかに有効桁数は同じ付近にありますが、30 乗などの 10 の大きなべき乗を扱う場合、その差は大きくなります。テスト プログラムとスクリプトの結果は次のとおりです。
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 である必要があります
ジャバテスト
テスト値 = 1.9891000000000000000e+30 テスト値は 1.9891e30 である必要があります
明らかに、c++ プログラムによって生成された testValue の値は間違っていますが、Java プログラムによって生成された testValue の値は正しいです。この問題に関するすべての洞察は、非常に高く評価されます。私はグーグルを検索しましたが、ここでは「c ++の誤った計算」という検索用語を使用して、重要な発見はありませんでした。