IEEE 754フロートが正確に表現できない最初の整数はどれですか?


162

わかりやすくするために、IEE 754 floatを実装する言語を使用していて、次のように宣言したとします。

float f0 = 0.f;
float f1 = 1.f;

...そしてそれらをプリントアウトすると、0.0000と1.0000が正確に得られます。

しかし、IEEE 754は実際の線に沿ったすべての数値を表すことができません。ゼロに近い、「ギャップ」は小さいです。遠ざかるにつれて、ギャップは大きくなります。

だから、私の質問は、IEEE 754 floatの場合、正確に表現できない最初の(ゼロに最も近い)整数ですか?私は今のところ、32ビットの浮動小数点数にのみ関心がありますが、誰かが64ビットの浮動小数点数を教えてくれれば、その答えを聞きたいと思います。

私は、これが2計算のような単純なようであろうと思っbits_of_mantissaに 1を加算し、bits_of_mantissaが何ビット標準露出させます。私のマシン(MSVC ++、Win64)で32ビットの浮動小数点に対してこれを行いましたが、問題はないようです。


代表できない数が必要なのに、なぜそれを追加したのですか?そして、あなたは何の番号を使いましたか?そして、この宿題は?そして、あなたの質問のタイトルは「整数」と言っていますが、あなたの質問は「浮動小数点」と言っています。
msw '25

5
仮数を最大化すると、表現可能な最大数が得られると考えたためです。2 ^ 22。いいえ、それは好奇心の問題です。問題のintが常に非常に小さくなることがわかっている場合でも、floatにintを入れることは常に罪悪感を感じていました。上限が知りたい。私の知る限り、タイトルと質問は同じですが、言い方が違うだけです。
Floomi



1
@KyleStrandが元に戻しました^ 2。当時、私にとって、どちらがより正しいと思われたのか、私にはわかりません。現在、「…はビット数です…」と比較すると、どちらも扱いにくいように見えます
Pascal Cuoq

回答:


211

2 仮数ビット+ 1 + 1

指数の+1(仮数ビット+ 1)は、仮数に含まabcdef...れる数値が含まれている場合、実際にはであり1.abcdef... × 2^e、暗黙の精度ビットが追加されるためです。

したがって、正確に表現できず、丸められる最初の整数は、
For float16、777,217(2 24 + 1)です。
の場合double、9,007,199,254,740,993(2 53 + 1)。

>>> 9007199254740993.0
9007199254740992

私はaを宣言し、float16,777,217に設定しました。しかし、それを使っcoutて印刷すると、16,777,216になりました。私は使用していC++ます。なぜ16,777,217を取得できないのですか?
硝酸ナトリウム2014年

18
@sodiumnitrate質問のタイトルを確認してください。16777217は、正確に表現できない最初の整数です。
kennytm 2014年

わかりました。混乱してしまい申し訳ありません。しかし、別の質問があります。16777216以降、表現可能な次の整数は2 * 16777216にならないのですか?私は同様のプログラムを実行すると、私は16777126.に2を追加することによって、16777218を取得
硝酸ナトリウム

5
2が最後の有効2進数になるので、次の整数は実際には16777218です。
kennytm 2014年

6
C ++では、のこと(1 << std::numeric_limits<float>::digits) + 1、およびCで、 (1 << FLT_MANT_DIG) + 1。前者はテンプレートの一部になる可能性があるので便利です。表現可能な最大の整数だけが必要な場合は、+ 1を追加しないでください。
Henry Schreiner 2017

38

nビット整数で表現できる最大値は2 n -1です。上記のように、a floatは仮数部で24ビットの精度を持ち、2 24が適合しないことを意味すると思われます。

しかし

指数の範囲内の2のべき乗は、1.0×2 nとして正確に表現できるため、2 24 適合し、その結果の最初の表現できない整数floatは2 24 +1になります。上記のとおり。再び。


1
これは、「余分な暗黙の精度」の部分を明確に説明しています。ありがとう。
chappjc 2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.