2017-08-22 5 views
8

1は、ローカルマシン上のchar、短い、int型などのような、異なる種類の範囲を計算するだけでなく、float型とdoubleすべき「Cプログラミング言語」から運動2.1を解決するために私の方法で作業します。 floatとdoubleを除いて、オーバーフローが発生するのを監視し、最大値/最小値を計算することができます。しかし、浮動小数点ではまだ動作していません。このコードは二度同じ値を出力する理由フロートをオーバーフローさせるには?

だから、質問はありますか?私は2番目の行は10で乗算してみinf

float f = 1.0; 
printf("%f\n",FLT_MAX); 
printf("%f\n",FLT_MAX + f); 
+0

数が指数形式で表現され、 'e'形式指定子を追加します。 – 0decimal0

+0

を参照してください。この質問:https://stackoverflow.com/questions/6910115/how-to-represent-float-number-in-memory-in-c たぶん、それはあなたのためにいくつかのものがより明確になります... –

+0

ます。https:/ /stackoverflow.com/a/1460431/6935629 – rsp

答えて

5

を印刷し、オーバーフローする場合はすべきであると思いました。オーバーフローしない理由は、すでに非常に大きな浮動小数点に小さな浮動小数点を追加しても、浮動小数点形式であるため、精度の桁数には限界があります。

あるいは、少なくともその最後の桁はおそらく動作します追加:

float f = 3.402823e38f; // FLT_MAX 
f = f + 0.000001e38f; // this should result in overflow 
+0

試行錯誤リード: 'printfの(「%fが\ nを」、FLT_MAX * 1.00000006f);'(少なくとも私のセットアップ上) –

+1

確認の追加として働く0.000001e38f' 'とよく –

2

それは二度同じ値を出力する理由は1.0FLOAT_MAXに追加するには小さすぎるということです。 floatは、通常、仮数部に24ビット、指数部に8ビットを持ちます。指数が127の非常に大きな値を持つ場合は、1.0を追加するには少なくとも127ビットの仮数が必要です。一例として、

、同じ問題が小数で存在する(および他)の指数値:あなたは1.00 * 10 のような3桁で番号を持っている場合は、このため は、あなたはそれに1を追加することはできません。 1'000'001となり、これには6桁の有効数字が必要です。

あなたは、繰り返し値を2倍にすることにより、floatをオーバーフローする可能性があります。

関連する問題