Java 言語仕様ポイント 3.10.2は、浮動小数点値が IEEE 754 標準で指定されているとおりに変換されることを示しています。の場合strtod
、C 標準では、関数がテキストを float 値に変換する方法が指定されています。表現自体に関しては、両者は同じケースをカバーしているようです。よくわからないのは、丸めルールはどうですか?Java コンパイラは、何とは異なる変換をstrtod
行いますか?
背景は、Java バイトコード コードにコンパイルしたいため、クラス ファイルでの表現のために float/double 値のテキスト表現を変換する必要があるということです。
たとえば、次の Java コードはより正確な値を出力します。
double value = 1.23412991913372577889911;
System.out.println(value);
// Output: 1.2341299191337258
strtod を使用して同じ値を変換して出力すると、正確ではない値が出力されます。
const char* textual = "1.23412991913372577889911";
double result = strtod(textual, ...);
std::cout << result << std::endl;
// Output: 1.23413
これは出力の問題ですか、それとも値が実際に別の方法で変換されているのでしょうか?
編集: Pascal Cuoqがコメントしたように、値を完全な精度で出力すると(私は設定でそうしましたstd::cout.precision()
)、値は等しいので、変換が同じ値につながると仮定します。そのためのテストを行うと思います。:-)