web-dev-qa-db-ja.com

同じビット数であるにもかかわらず、floatとintの最大値が異なるのはなぜですか?

重複の可能性:
Javaでサイズが同じ場合のfloatデータ型と整数データ型の違いは何ですか?

ご存知かもしれませんが、これらのタイプはどちらも32ビットです。intは整数のみを保持できますが、float浮動小数点 数値(タイプ名として)もサポートします。提案)。

では、intの最大値が2である可能性はどのようにありますか。31、およびfloatの最大値は3.4 * 10です。38、両方とも32ビットですが?

intの最大値の容量は、浮動小数点数のメモリを節約せず、整数のみを受け入れるため、浮動小数点数よりも大きくする必要があると思います。その場合は説明させていただきます。

31
idish

あなたの直感は、どちらも32ビットであるため、一方に情報コンテンツが存在することはできないことを正しく示しています。しかし、それは、これらのビットを使用して表現異なる値を使用できないという意味ではありません。

uint4foo4の2つの新しいデータ型を発明したとします。 uint4は、標準のバイナリ表現で整数を表すために4ビットを使用するため、次のようになります。

bits   value
0000       0
0001       1
0010       2
...
1111      15

ただし、foo4は4ビットを使用してこれらの値を表します。

bits   value
0000       0
0001      42
0010     -97
0011       1
...
1110      pi
1111       e

これで、foo4は、同じビット数であるにもかかわらず、uint4よりもはるかに広い値の範囲になります。どうやって? できないuint4で表されるfoo4値がいくつかあるため、ビットマッピングのそれらの「スロット」は他の値に使用できます。


intfloatについても同じです。どちらも2つのセットから値を格納できます。32 値、ちょうど異なる2のセット32 値。

47
AakashM

浮動小数点数はより高い数値を格納する場合がありますが、小数点以下の桁でも正確ではありません。次の例を考えてみましょう。

float a = 123456789012345678901234567890f; //30 digits
Console.WriteLine(a);  // 1.234568E+29

精度がほとんど維持されていないことに注意してください。

一方、整数は常にその値の範囲内の任意の数値を正確に格納します。

比較のために、倍精度浮動小数点数を見てみましょう。

double a = 123456789012345678901234567890d; //30 digits
Console.WriteLine(a); // 1.23456789012346E+29

有効数字の約2倍が保持されていることに注意してください。

12
Rotem

これらはIEEE754浮動小数点仕様に基づいているため、それが可能です。これを読んでください ドキュメント 。それはビット数だけではありません。

4
kosa

ヒントは、「浮動小数点」の「浮動」部分にあります。あなたの言うことは基本的に定点を前提としています。浮動小数点数は、小数点以下の桁に「スペースを予約」しません。桁数には制限があり(23バイナリ)、2の累乗で乗算することを記憶しています。

4
harold