float 単精度浮動小数点数コンピュータ内では4バイトを占め、32ビットの2進数で表されます。

double 倍精度浮動小数点数コンピュータ内では8バイトを占め、64ビットの2進数で表されます。

浮動小数点数はコンピュータ内では指数形式で表され、次のように分解されます:符号、仮数、指数符号、指数の4つの部分です。

数符は1ビットの2進数を占め、数の正負を表します。

指数符は1ビットの2進数を占め、指数の正負を表します。

仮数は浮動小数点数の有効数字を表し、0.xxxxxxx ですが、先頭の0と小数点は保存されません。

指数には指数の有効数字が保存されます。

指数が何ビットを占めるか、仮数が何ビットを占めるかは、コンピュータシステムによって決まります。

数符と仮数で24ビット、指数符と指数で8ビットを占める場合もあれば --float。

数符と仮数で48ビット、指数符と指数で16ビットを占める場合もあります --double。

この4つの部分のビット数がわかれば、2進数で大きさの範囲を見積もり、それを10進数に換算することで、知りたい数値範囲が得られます。

プログラマーにとって、double と float の違いは、double は精度が高く有効数字が16桁、float は精度が7桁であることです。しかし、double は float の2倍のメモリを消費し、double の演算速度は float よりはるかに遅くなります。C言語では、double と float では数学関数の名前が異なるため、書き間違えないようにしてください。単精度で済む場合は、メモリを節約して演算速度を上げるために、倍精度を使わないでください。

型ビット数有効数字数値範囲
float32 6-7 -3.4*10(-38)~3.4*10(38)
double 64 15-16 -1.7*10(-308)~1.7*10(308)
long double 128 18-19 -1.2*10(-4932)~1.2*10(4932)

簡単に言うと、Float は単精度で、メモリ内で4バイトを占め、有効桁数は7桁です(正負があるため8桁ではありません)。私のパソコンの VC++6.0 プラットフォームでは、デフォルトで6桁の有効数字が表示されます。double は倍精度で、8バイトを占め、有効桁数は16桁ですが、私のパソコンの VC++6.0 プラットフォームでは、デフォルトで同じく6桁の有効数字が表示されます。

例:C と C++ では、次のような代入文があります:

float a=0.1; 

コンパイラがエラーを報告します:warning C4305: 'initializing' : truncation from 'const double ' to 'float '

原因:C/C++ では(VC++ だけでそうなるのかはわかりませんが)、上記の文の等号の右側にある 0.1 は float だと思われますが、コンパイラはそれを double とみなします(小数はデフォルトで double のため)。そのためこの warning が報告されます。通常は次のように変更します:0.1fで問題ありません。

私は普段、float を使わずに double を使用することが多いです。

C言語とC#言語では、浮動小数点型のデータには単精度型floatと倍精度型doubleを使用して保存します。floatデータは32ビットを占有し、doubleデータは64ビットを占有します。変数を宣言するとき、float f= 2.25fメモリはどのように割り当てられるのでしょうか?もしでたらめに割り当てられたら、世の中めちゃくちゃになってしまいますよね。実際には、float も double も保存方式は IEEE の規格に従っています。float は IEEE R32.24 に従い、double は R64.53 に従います。

単精度でも倍精度でも、保存時には次の3つの部分に分けられます:

  • 符号部(Sign):0 は正を表し、1 は負を表します。
  • 指数部(Exponent):科学的記数法における指数データを保存するために使用され、シフト保存方式を採用しています。
  • 仮数部(Mantissa):仮数部分。

出典URL:https://my.oschina.net/zd370982/blog/724265