1. ホーム
  2. c++

[解決済み] floatとdoubleの違いは何ですか?

2022-03-19 16:46:19

質問

倍精度と単精度の違いについて読んだことがあります。しかし、ほとんどの場合 floatdouble は互換性があるように見えます。つまり、どちらを使っても結果に影響がないように見えます。これは本当にそうなのでしょうか?floatとdoublesはどのような場合に交換可能なのでしょうか?また、両者の間にはどのような違いがあるのでしょうか?

どのように解決するのですか?

大きな違いです。

その名の通り double の2倍の精度を持ちます。 float [1] . 一般に double は小数点以下15桁の精度を持ち、一方 float は7個です。

桁数の計算方法はこうです。

double は仮数52ビット+隠しビット1ビット:log(2) 53 )÷log(10)=15.95桁

float は仮数23ビット+隠れビット1ビット:log(2) 24 )÷log(10)=7.22桁

この精度の低下は、例えば、繰り返し計算を行った場合に、切り捨て誤差がより大きく蓄積される可能性がある。

float a = 1.f / 81;
float b = 0;
for (int i = 0; i < 729; ++ i)
    b += a;
printf("%.7g\n", b); // prints 9.000023

の間に

double a = 1.0 / 81;
double b = 0;
for (int i = 0; i < 729; ++ i)
    b += a;
printf("%.15g\n", b); // prints 8.99999999999996

また、floatの最大値は約 3e38 が、double は約 1.7e308 ということで float よりもはるかに簡単に無限大(つまり特殊な浮動小数点数)をヒットすることができます。 double 例えば60の階乗を計算するような単純なものであれば

テストでは、いくつかのテストケースにこのような巨大な数値が含まれることがあり、浮動小数点数を使用するとプログラムが失敗することがあります。


もちろん、時には double では十分な精度が得られないので、時には long double [1] (上記の例では、Macで9.00000000000066となります) しかし、すべての浮動小数点型は、次のような問題があります。 丸め誤差 そのため、精度を重視する場合(例:貨幣処理)には int または分数クラスです。


さらに += を使うと、浮動小数点数の和を求めると、すぐにエラーが蓄積されます。Pythonを使っている場合は fsum . それ以外の場合は Kahan 和算アルゴリズム .


[1]: CとC++の規格では float , doublelong double . 3つともIEEE倍精度で実装されている可能性があります。とはいえ、ほとんどのアーキテクチャ(gcc, MSVC; x86, x64, ARM)において float は、確かにIEEE単精度浮動小数点数(binary32)であり、かつ double IEEE 倍精度浮動小数点数(binary64)である。