私はここで解答に従いました:How to Calculate Double + Float Precisionとタイプdoubleの変数の最大値を計算できませんでした。Cのdouble変数の最大値を計算する際のエラー
私が実行します。
double dbl_max = pow(2, pow(2, 10)) * (1-pow(2, -53));
printf("%.2e", dbl_max);
Result: inf
または:
double dbl_max = (pow(2, pow(2, 10)));
printf("%.2e", dbl_max);
Result: inf
または:
double dbl_max = pow(2, pow(2, 9)) * (1-pow(2, -53));
printf("%.2e", dbl_max);
Result: 1.34e+154
を計算は、変数に嵌合されていないのはなぜ?上記の上のサンプルは、浮動小数点変数でうまく動作します。
中間指数が高すぎる1であることにより、最終的な結果を乗じて補正することができます。 'pow(2,10)'を '(pow(2,10)-1) 'に変更すれば動作します。最終的な結果に2を掛けて補うことができます。 –
2の累乗を計算するのに 'pow'を使用しないでください。良い数学ライブラリがこれらの権利を得るでしょうが、すべての数学ライブラリがそうであるとは限りません-pow'は浮動小数点関数です。平凡な品質の数学ライブラリは概算結果を返します。浮動小数点で2の整数の累乗を生成するには、 'double'に' ldexp(1、n) 'を、' float'に 'ldexpf(1、n)'を使います。整数で2の累乗を生成するには、 '(type)1 << n'を使います。ここで、「type」は結果に必要な整数型です(例えば、uint32_tなど)。 –