[解決済み] floatとdoubleの違いは何ですか?
質問
倍精度と単精度の違いについて読んだことがあります。しかし、ほとんどの場合
float
と
double
は互換性があるように見えます。つまり、どちらを使っても結果に影響がないように見えます。これは本当にそうなのでしょうか?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
,
double
と
long double
. 3つともIEEE倍精度で実装されている可能性があります。とはいえ、ほとんどのアーキテクチャ(gcc, MSVC; x86, x64, ARM)において
float
は
は、確かにIEEE単精度浮動小数点数(binary32)であり、かつ
double
は
IEEE 倍精度浮動小数点数(binary64)である。
関連
-
[解決済み] [Solved] Error C1083: Cannot open include file: 'stdafx.h'
-
[解決済み】C++でランダムな2倍数を生成する
-
[解決済み】c++でstd::vectorを返すための効率的な方法
-
[解決済み】変数やフィールドがvoid宣言されている
-
[解決済み] explicit キーワードの意味は?
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] .NETでのdecimal, float, doubleの違い?
-
[解決済み] const int*、const int * const、int const *の違いは何ですか?
-
[解決済み】C/C++の"-->"演算子とは何ですか?
-
[解決済み] Intel CPU の _mm_popcnt_u64 で、32 ビットのループカウンターを 64 ビットに置き換えると、パフォーマンスが著しく低下します。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++ クラスヘッダが含まれているときに「不明な型」があるのはなぜですか?重複
-
[解決済み】C++でint型に無限大を設定する
-
[解決済み】C++ - 解放されるポインタが割り当てられていないエラー
-
[解決済み】C++でユーザー入力を待つ【重複あり
-
[解決済み】C++のGetlineの問題(オーバーロードされた関数 "getline "のインスタンスがない
-
[解決済み】Cygwin Make bash コマンドが見つかりません。
-
[解決済み】関数名の前に期待されるイニシャライザー
-
[解決済み】エラー:strcpyがこのスコープで宣言されていない
-
[解決済み] 数値定数の前にunqualified-idを付けて、数値を定義することを期待する。
-
[解決済み] スタックアロケーションにより初期化されていない値が作成された