明確にするために、IEE 754 floatを実装する言語を使用していて、次のように宣言している場合:
float f0 = 0.f;
float f1 = 1.f;
...それからそれらを印刷して、0.0000と1.0000を取得します-正確に。
しかし、IEEE 754は実際の線に沿ったすべての数値を表すことができません。ゼロに近い「ギャップ」は小さいです。遠くに行くと、ギャップが大きくなります。
だから、私の質問は:正確に表現できない最初の(ゼロに最も近い)整数であるIEEE 754 floatの場合私は今のところ32ビットのfloatのみに関心がありますが、誰かがそれを与えた場合、64ビットの答えを聞くことに興味があります!
これは2を計算するのと同じくらい簡単だと思ったbits_of_mantissa 1を追加します。bits_of_mantissaは、標準が公開するビット数です。私は自分のマシン(MSVC++、Win64)で32ビットの浮動小数点数に対してこれを行いましたが、うまくいきました。
2仮数ビット+ 1 + 1
指数の+1(仮数ビット+ 1)は、仮数にabcdef...
それが表す数は実際には1.abcdef... × 2^e
、追加の暗黙的なビット精度を提供します。
float
の場合、16,777,217(224 + 1)。double
の場合、9,007,199,254,740,993(253 + 1)。
>>> 9007199254740993.0
9007199254740992
で表現可能な最大値 n ビット整数は2n-1。上記のように、float
の仮数部の精度は24ビットであり、これは224 収まりません。
ただし。
指数の範囲内の2のべき乗は、1.0×2として正確に表現できます。n、だから224 can fitとその結果、float
の最初の表現できない整数は224+1。上記のように。再び。