ご存知かもしれませんが、これらのタイプはどちらも32ビットです。int
整数のみを保持できますが、浮動小数点float
数もサポートします(型名が示すように)。
では、の最大値int
が2 31であり、の最大値 float
が3.4 * 10 38であり、両方とも32ビットである可能性はありますか?
int
浮動小数点数のメモリを節約せず、整数のみを受け入れるため、の最大値容量は浮動小数点数よりも大きくする必要があると思います。その場合は説明させていただきます。
ご存知かもしれませんが、これらのタイプはどちらも32ビットです。int
整数のみを保持できますが、浮動小数点float
数もサポートします(型名が示すように)。
では、の最大値int
が2 31であり、の最大値 float
が3.4 * 10 38であり、両方とも32ビットである可能性はありますか?
int
浮動小数点数のメモリを節約せず、整数のみを受け入れるため、の最大値容量は浮動小数点数よりも大きくする必要があると思います。その場合は説明させていただきます。
あなたの直感は、どちらも32ビットであるため、一方に他方よりも多くの情報コンテンツが存在することはできないことを非常に正しく示しています。しかし、それは、これらのビットを使用して異なる値を表すことができないという意味ではありません。
2つの新しいデータ型とを発明したuint4
としfoo4
ます。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
これはとについても同じです。どちらも232int
値のセットからの値をfloat
格納できますが、232値のセットが異なるだけです。
浮動小数点はより高い数値を格納する可能性がありますが、小数点の前の桁でも正確ではありません。次の例を考えてみましょう。
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進数)、2の累乗で乗算することを記憶しています。