web-dev-qa-db-ja.com

サイズが同じ場合、floatデータ型とintegerデータ型の違いは何ですか?

サイズが同じ場合、floatデータ型とintegerデータ型の違いは何ですか?

33
akk
  • floatは、浮動小数点値、つまり潜在的な小数位を持つ値を格納します
  • intは整数値、つまり整数のみを格納します

したがって、両方とも32ビット幅ですが、その使用(および表現)はまったく異なります。 3.141を整数に格納することはできませんが、floatには格納できます。

両方をさらに詳しく分析します。

整数では、allビットが数値の格納に使用されます。これは(Javaおよび多くのコンピューターも)いわゆる2の補数で行われます。これは基本的に、-2の値を表すことができることを意味します。31 2へ31− 1。

フロートでは、これらの32ビットは、符号ビット、指数、仮数の3つの異なる部分に分割されます。それらは次のようにレイアウトされています。

S EEEEEEEE MMMMMMMMMMMMMMMMMMMMMMM

数値が負か非負かを決定する単一のビットがあります(ゼロは正でも負でもありませんが、符号ビットはゼロに設定されます)。次に、8ビットの指数と23ビットの仮数があります。それから有用な数値を取得するために、(大体)次の計算が実行されます。

[〜#〜] m [〜#〜]×2[〜#〜] e [〜#〜]

(それだけではありませんが、この議論の目的にはこれで十分です)

仮数は、本質的には24ビットの整数以下です。これは、指数部の2の累乗で乗算されます。これは、おおよそ、-128〜127の間の数値です。

したがって、24ビット整数に収まるすべての数値を正確に表すことができますが、指数が大きいほど値が大きくなるため、数値の範囲も大きくなります。たとえば、floatの最大値は約3.4×10です38 intは最大2.1×10の値のみを許可します9

ただし、32ビットには4.2×10しかないため、9 さまざまな状態(すべてintが格納できる値を表すために使用されます)、floatの数値範囲の大きい方の端では、数値の間隔が広くなります(一意のfloat番号よりも一意のint番号はありえないため)。そのため、一部の数値を正確に表すことはできません。たとえば、数字2×1012 floatの表現は1,999,999,991,808です。 close to 2,000,000,000,000かもしれませんが、正確ではありません。同様に、その数に1を追加しても、floatが使用しているより大きなスケールで差を付けるには1が小さすぎるため、変更されません。

同様に、floatで非常に小さい数値(0から1)を表すこともできますが、数値が非常に大きいか非常に小さいかに関係なく、floatの精度は10進数で約6桁または7桁です。大きな数字がある場合、それらの数字は数字の先頭にあります(例:4.51534×1035、これは451534の後に30個のゼロが続くだけです。また、floatは、これらの30桁が実際にゼロであるか、他の何かであるかなど、非常に小さな数(たとえば3.14159×10−27)開始桁の0.0000をはるかに超えて、番号の遠端にあります...

85
Joey

浮動小数点数は、整数に収まるよりも広い範囲の数値を格納するために使用されます。これらには、10進数と32ビットに収まるよりも大きな値になる可能性のある科学表記スタイル番号が含まれます。詳細は次のとおりです。 http://en.wikipedia.org/wiki/Floating_point

2
sblundy