ご存知かもしれませんが、これらのタイプはどちらも32ビットです。int
は整数のみを保持できますが、float
は 浮動小数点 数値(タイプ名として)もサポートします。提案)。
では、int
の最大値が2である可能性はどのようにありますか。31、およびfloat
の最大値は3.4 * 10です。38、両方とも32ビットですが?
int
の最大値の容量は、浮動小数点数のメモリを節約せず、整数のみを受け入れるため、浮動小数点数よりも大きくする必要があると思います。その場合は説明させていただきます。
あなたの直感は、どちらも32ビットであるため、一方に情報コンテンツが存在することはできないことを正しく示しています。しかし、それは、これらのビットを使用して表現異なる値を使用できないという意味ではありません。
uint4
とfoo4
の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
値がいくつかあるため、ビットマッピングのそれらの「スロット」は他の値に使用できます。
int
とfloat
についても同じです。どちらも2つのセットから値を格納できます。32 値、ちょうど異なる2のセット32 値。
浮動小数点数はより高い数値を格納する場合がありますが、小数点以下の桁でも正確ではありません。次の例を考えてみましょう。
float a = 123456789012345678901234567890f; //30 digits
Console.WriteLine(a); // 1.234568E+29
精度がほとんど維持されていないことに注意してください。
一方、整数は常にその値の範囲内の任意の数値を正確に格納します。
比較のために、倍精度浮動小数点数を見てみましょう。
double a = 123456789012345678901234567890d; //30 digits
Console.WriteLine(a); // 1.23456789012346E+29
有効数字の約2倍が保持されていることに注意してください。
これらはIEEE754浮動小数点仕様に基づいているため、それが可能です。これを読んでください ドキュメント 。それはビット数だけではありません。
ヒントは、「浮動小数点」の「浮動」部分にあります。あなたの言うことは基本的に定点を前提としています。浮動小数点数は、小数点以下の桁に「スペースを予約」しません。桁数には制限があり(23バイナリ)、2の累乗で乗算することを記憶しています。