web-dev-qa-db-ja.com

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

明確にするために、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ビットの浮動小数点数に対してこれを行いましたが、うまくいきました。

146
Floomi

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
180
kennytm

で表現可能な最大値 n ビット整数は2n-1。上記のように、floatの仮数部の精度は24ビットであり、これは224 収まりません。

ただし

指数の範囲内の2のべき乗は、1.0×2として正確に表現できます。n、だから224 can fitとその結果、floatの最初の表現できない整数は224+1。上記のように。再び。

35
thus spake a.k.