2017-11-14 9 views
0

私はここで解答に従いました: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 

を計算は、変数に嵌合されていないのはなぜ?上記の上のサンプルは、浮動小数点変数でうまく動作します。

+0

中間指数が高すぎる1であることにより、最終的な結果を乗じて補正することができます。 'pow(2,10)'を '(pow(2,10)-1) 'に変更すれば動作します。最終的な結果に2を掛けて補うことができます。 –

+0

2の累乗を計算するのに 'pow'を使用しないでください。良い数学ライブラリがこれらの権利を得るでしょうが、すべての数学ライブラリがそうであるとは限りません-pow'は浮動小数点関数です。平凡な品質の数学ライブラリは概算結果を返します。浮動小数点で2の整数の累乗を生成するには、 'double'に' ldexp(1、n) 'を、' float'に 'ldexpf(1、n)'を使います。整数で2の累乗を生成するには、 '(type)1 << n'を使います。ここで、「type」は結果に必要な整数型です(例えば、uint32_tなど)。 –

答えて

1

中間指数が高すぎます。 pow(2, 10)(pow(2, 10) - 1)に変更し、 を有効にする必要があります。あなたは 2. –  トムKarzes

double dbl_max = pow(2, pow(2, 10)-1) * (1-pow(2, -53)) * 2; 
printf("%.2e", dbl_max); 
+0

ありがとうございました。中間指数が高すぎるのはなぜですか?私は計算が変数に正確に収まると思うでしょう。近似結果を返す劣等数学ライブラリについてEricが言ったことに関連していますか? –

関連する問題