193

明確にするために、IEE 754フロートを実装する言語を使用していて、次のように宣言している場合:

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

...そしてそれらを印刷して戻すと、0.0000と1.0000が得られます-正確に。

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

だから、私の質問は、IEEE 754フロートの場合、正確に表現できない最初の(ゼロに最も近い)整数ですか?今のところ、私は32ビットフロートだけに関心がありますが、誰かがそれを与えた場合、64ビットの答えを聞くことに興味があります!

これは、2ビットの仮数を計算して1を加算するのと同じくらい簡単だと思いました。ここで、 bits_of_mantissaは、標準が公開するビット数です。自分のマシン(MSVC ++、Win64)の32ビットフロートに対してこれを実行しましたが、問題ないように見えました。

4

2 に答える 2

247

仮数2ビット+1 +1

指数 (仮数ビット + 1) の +1 は、仮数がabcdef...表す数値が実際に含まれている場合1.abcdef... × 2^e、余分な暗黙的な精度ビットを提供するためです。

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

>>> 9007199254740993.0
9007199254740992
于 2010-09-25T13:14:50.267 に答える
46

nビットの整数で表現できる最大値は 2 n -1 です。上で述べたように、 afloatは仮数部に 24 ビットの精度があり、これは 2 24が適合しないことを暗示しているように思われます。

しかし

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

于 2014-04-12T13:51:02.950 に答える