Java と C/C++ の両方でいくつかの参照アルゴリズムをコーディングしています。これらのアルゴリズムの一部は π を使用します。各アルゴリズムの 2 つの実装で、異なる丸めを行わずに同じ結果が得られるようにしたいと考えています。これまで一貫して機能してきたこれを行う 1 つの方法はpi
、3.14159 など、両方の言語でまったく同じカスタム定義の定数を使用することです。ただし、Java ライブラリと GCC ライブラリの両方で高精度の定数が既に定義されている場合に pi を定義するのはばかげていると思います。
簡単なテスト プログラムを作成し、各ライブラリのドキュメントを調べ、浮動小数点型について調べました。しかし、java.lang.Math.PI (または java.lang.StrictMath.PI) が math.h の M_PI と等しい、または等しくない、ということを確信できませんでした。
GCC 3.4.4 (cygwin) math.h には以下が含まれます。
#define M_PI 3.14159265358979323846
^^^^^
でもこれは
printf("%.20f", M_PI);
生産する
3.14159265358979311600
^^^^^
これは、最後の 5 桁が信頼できないことを示唆しています。
一方、Javadocs によると、java.lang.Math.PI は次のとおりです。
円の円周と直径の比であるpiに最も
double
近い値。
と
public static final double PI 3.141592653589793d
これにより、定数から疑わしい最後の 5 桁が省略されます。
System.out.printf("%.20f\n", Math.PI);
生産する
3.14159265358979300000
^^^^^
浮動小数点データ型の専門知識があれば、これらのライブラリ定数が完全に等しいと納得できますか? それとも、それらは絶対に等しくないということですか?