1. ホーム
  2. types

[解決済み] IEEE754の浮動小数点が正確に表現できない最初の整数はどれでしょう?

2022-04-19 12:26:28

質問

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

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

...そして、それらをプリントアウトし直すと、0.0000と1.0000が得られます - まさに。

しかし、IEEE754は実線に沿ったすべての数字を表現できるわけではありません。ゼロに近いところでは「ずれ」は小さく、離れると「ずれ」は大きくなる。

そこで、質問です。 IEEE754のフロートで、正確に表現できない最初の(ゼロに近い)整数はどれでしょうか? 私は今のところ32ビット浮動小数点にしか興味がないのですが、もし誰かが64ビットの答えを出したら聞いてみたいものです。

これは2を計算するのと同じくらい簡単だと思いました。 ビット を追加し、1 を加える。 ビット_オブ_マンティサ は、その規格が公開しているビット数です。私のマシン(MSVC++, Win64)では32bitのfloatに対してこれを行いましたが、問題ないようです。

どのように解決するのですか?

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