Intは+-2 ^ 31の範囲の4バイトです。Floatは+-1.2E(+-38)の範囲の4バイトです。
フロートは、実線上の非常に多くのポイントを包含しますが、intのサイズに等しくなります。 floatのSign-Exponent-Fraction表現は非常に素晴らしく(またはIntの2の補数があまりにも哀れです)、このサイズの不一致が生じますか?何か不足していますか?
実数行全体を(事実上)表すものが、整数を表すものと同じサイズであることは非常に驚くべきことです。
さて、ここに簡単な説明があります:
通常、intとfloatはメモリ内で「1ワード」を占有します。現在、64ビットシステムへの移行により、これはWordが64ビット、つまり8バイトであり、膨大な数の数字を表現できることを意味する場合があります。または、メモリ内の各Wordが4バイトを占有する32ビットシステムでもかまいません。通常、メモリはWord単位でアクセスできます。
int
とfloat
の違いは、メモリ内の物理的なスペースではなく、ALU(算術論理ユニット)が数値で動作する方法です。 intは、2進数で直接対応する数値を表します(まあ、ほとんど 2の補数表記 を使用します)。一方、float
はエンコードされ(通常IEEE 754標準形式)、指数形式の数値を表します(つまり、2.99 * 10 ^ 6は指数形式になります)。
あなたの誤解は、浮動小数点がより多くの情報を表すことができるという誤解にあると思います。 float
sはより大きな数を表すことができますが、指数のエンコードを考慮する必要があるため、それほど正確に表すことはできません。指数自体は非常に大きな数になる可能性があります。したがって、浮動小数点数から得られる有効数字の数は少なくなり(つまり、表示される情報が少なくなります)、int
sは整数の範囲を表しますが、それらが表す数値の大きさははるかに小さくなります。
実数行全体を(事実上)表すものが、整数を表すものと同じサイズであることは非常に驚くべきことです。
おそらく、32ビットint
が正確に表すことのできる整数と、32ビットfloat
が表すことのできない整数がたくさんあることを理解すれば、これはそれほど驚くことではないでしょう。
float
は、int
よりも少ない数のdistinct数を表すことができますが、より広い範囲に広がっています。
また、連続するfloats
の間の間隔は、ゼロから遠ざかるにつれて広くなりますが、連続するints
の間は一定のままです。
ここで重要な点は、intは正確ですが、floatは丸められる可能性があることです。フロートのデータの一部は小数点の位置を表し、別の部分は値を決定します。したがって、1.2E38を表示できる場合もありますが、最初の数桁のみが正しく、残りは0で埋められます。
From: http://en.wikipedia.org/wiki/Floating_point
「さらに、10進数7桁で1.234567、123456.7、0.00001234567、1234567000000000などを表すことができます」
特定のシステムがフロートを実装する方法に依存します。
多分あなたは学ぶべきです コンピューターでの浮動小数点数の表現方法 これは整数の表現方法とは非常に異なります。
また、intは常に4バイトの長さではなく、システムに依存することに注意してください。
両方のタイプは、実際のライン上の同じ量のポイントを表します-それらは異なる間隔で配置されています。最も高いフロートと2番目に高いフロートの差は約2です。 256!
標準による浮動小数点の標準では、base = 10および24桁(精度)の代わりにbase = 2が必要です。基数10ではないため、基数2の形式は、実数の明確なセットのみを表現できます(これは、実数の表現におけるエラーの固有の理由です)。また、前述のとおり、floatはintに比べて多くの数値を表していないことを意味します。