いつフロートを使用し、いつダブルを使用しますか


194

多くの場合、プログラミングの経験では、実数にfloatを使用するかdoubleを使用するかを決定する必要があります。フロートに行くこともあれば、ダブルに行くこともありますが、実際にはもっと主観的に感じます。私が自分の決定を守るために直面​​するなら、おそらく正当な理由を述べないでしょう。

いつfloatを使用し、いつdoubleを使用しますか?常にメモリ制約が存在する場合にのみ、doubleを使用しますか?または、精度の要件でdoubleを使用する必要がない限り、常にfloatを使用しますか?floatとdoubleの間に基本的な数理計算の計算の複雑さに関して実質的な違いはありますか?floatまたはdoubleを使用することの長所と短所は何ですか?そして、ロングダブルを使用しましたか?


28
多くの場合、どちらも使用せず、10進浮動小数点型または固定小数点型を使用します。2進浮動小数点型は、ほとんどの小数を正確に表すことはできません。
CodesInChaos

3
関連した浮動小数点の丸めエラーが発生しますか?。@CodesInChaosの私の答えは、あなたがその決定を下すのに役立つリソースを提案しています。万能のソリューションはありません。
マークブース

非常に良い答えが見つかりました:スタックオーバーフロー
ハリス

5
「10進数」とはどういう意味ですか。0.01のような値を正確に表現する必要がある場合(お金の場合)、(バイナリ)浮動小数点は答えではありません。整数以外の数字を意味するだけの場合、浮動小数点は問題ありませんが、「小数」は必要なものを説明するのに最適な単語ではありません。
キーストンプソン

1
常に選択肢があるわけではありません。たとえば、Arduinoプラットフォームでは、doubleとfloatの両方がfloatに相当します。実際のdoubleを処理するには、アドインライブラリを見つける必要があります。
キウィロン

回答:


187

浮動小数点型のデフォルトの選択はですdouble。これはまた、あなたが接尾辞なしまたは(Cで)浮動小数点リテラルを取得するタイプの浮動小数点数(例えば上で動作し、標準的な機能であるexpsinなど)。

float 多くの浮動小数点数(数千以上の単位で考えてください)で操作する必要がある場合にのみ使用してください。アルゴリズムの分析により、範囲と精度の低下は問題になりません。

long doubleを超える範囲または精度が必要な場合double、およびターゲットプラットフォームでこれを提供する場合に使用できます。

要約すると、floatlong doubleして、専門家による使用のために予約されなければならないdouble「日常」の使用のために。


10
浮動小数点のキャッシュとデータ転送に関連するパフォーマンスの問題がなければ、おそらく数千の値のフロートを考慮しないでしょう。通常、フロートが十分に正確であることを示すために分析を行うにはかなりのコストがかかります。
パトリシアシャナハン

4
補足として、他のシステムとの互換性が必要な場合は、同じデータ型を使用すると有利な場合があります。
zzzzBov

15
私はフロートを1000ではなく数百万の数値に使用します。また、一部のGPUでは、フロートを使用するとパフォーマンスが向上します。その場合、フロートを使用します。そうでなければ、あなたが言うように、ダブルを使用します。
user949300 14

4
@PatriciaShanahan-「に関連するパフォーマンスの問題。」良い例は、SSE2または同様のベクトル命令を使用する予定の場合、フロートで4つのops / vectorを実行できます(ダブルあたり2対)。これにより、大幅な速度向上が得られます(読み取りと書き込みが必要なopsとデータの半分)。これにより、フロートの使用が魅力的なしきい値を大幅に下げることができ、数値の問題を整理する手間をかける価値があります。
グレゴ14

12
私はこの答えを1つの追加のアドバイスで支持しています:表示用のRGB値で操作しているときはfloat、人間の目、ディスプレイ、またはカラーシステムのどちらもそれほど多くの精度を持たないため、使用することは許容されます(時には半精度) 。このアドバイスは、たとえばOpenGLなどに適用されます。この追加のアドバイスは、より厳密な精度が要求される医療画像には適用されません。
rwong 14年

42

最新のコンピューターを対象とするコードでは、doubleの代わりにfloatを使用することはめったにありません。余分な精度は、丸め誤差または問題を引き起こす他の不正確さの可能性を減らします(しかし、排除しません)。

floatを使用する主な理由は次のとおりです。

  1. 多数の大きな配列を格納しているため、プログラムのメモリ消費を削減する必要があります。
  2. 倍精度浮動小数点をネイティブでサポートしていないシステムをターゲットにしている。最近まで、多くのグラフィックカードは単精度浮動小数点のみをサポートしていました。浮動小数点サポートが制限されている低電力および組み込みプロセッサもたくさんあると確信しています。
  3. 単精度が倍精度よりも高速で、アプリケーションが浮動小数点演算を多用するハードウェアを対象としています。最新のIntel CPUでは、すべての浮動小数点計算は倍精度で行われるため、ここでは何も得られません。
  4. たとえば、一度に複数の数値を操作する特別なCPU命令を使用して、低レベルの最適化を行っています。

そのため、基本的に、ハードウェアの制限がない限り、または倍精度の数値を格納することがメモリ使用量に大きく貢献していることが分析によって示されない限り、doubleを使用する方法です。


2
Intel x86プロセッサーを意味する「現代のコンピューター」。古代人が使用した機械のいくつかは、基本的なフロートタイプで完全に適切な精度を提供しました。(CDC 6600は60ビットワード、48ビットの正規化された浮動小数点仮数、12ビットの指数を使用しました。これはx86が倍精度のために提供するものです。)
ジョンR.ストローム14

@ John.R.Strohm:同意しましたが、CコンパイラはCDC6600には存在しませんでした。これは、FortranのIV ...だった
バジーレStarynkevitch

「最新のコンピューター」とは、IEEE浮動小数点標準が広く実装されて以来、過去10〜20年、または実際に構築されたプロセッサーを意味します。非x86アーキテクチャが存在することを完全に認識しており、その答えを念頭に置いて-通常はx86ではないGPUと組み込みプロセッサに言及しました。
user611910

しかし、それは単に真実ではありません。SSE2は1回の操作で4つのフロートまたは2つのダブルを操作でき、AVXは8つのフロートまたは4つのダブルを操作でき、AVX-512は16のフロートまたは8つのダブルを操作できます。あらゆる種類の高性能コンピューティングでは、floatの計算は、x86のdoubleでの同じ演算の2倍の速度と考える必要があります。
ラリーグリッツ

1
さらに、プロセッサキャッシュに2倍の数の浮動小数点数を収めることができ、メモリレイテンシが多くのプログラムの主なボトルネックになる可能性が高いため、それよりもさらに悪くなります。フロートのワーキングセット全体をキャッシュ内で暖かく保つことは、ダブルを使用してRAMに流出させるよりも文字通り高速です。
ラリーグリッツ

10

doubleすべての計算と一時変数に使用します。使用floatあなたは数字の配列を維持する必要がある場合- float[](精度が十分であれば)、あなたは何万もの上を扱っているfloat数字。

多くの/ほとんどの数学関数または演算子はconvert / return doubleでありfloat、中間ステップで数値をキャストしたくありません。

たとえば、ファイルまたはストリームから100,000個の数字の入力があり、それらを並べ替える必要がある場合は、数字をに入れfloat[]ます。


5

一部のプラットフォーム(ARM Cortex-M2、Cortex-M4など)はdoubleをサポートしていません(プロセッサのリファレンスマニュアルで常に確認できます。コンパイルの警告またはエラーがない場合、コードが最適であることを意味しません。doubleはエミュレートできます。)。そのため、intまたはfloatに固執する必要があるかもしれません。

そうでない場合は、doubleを使用します。

D. Goldbergの有名な記事(「すべてのコンピューター科学者が浮動小数点演算について知っておくべきこと」)を確認できます。浮動小数点演算を使用する前によく考えてください。あなたの特定の状況では、それらがまったく必要とされない可能性がかなりあります。

http://perso.ens-lyon.fr/jean-michel.muller/goldberg.pdf


3
この質問は1年前にすでにかなり答えられていました...しかし、いずれにせよ、倍精度FPUアクセラレーションを備えたプラットフォームでdoubleを使用するときはいつでも、それが他の手段で使用されるべきだと言いますFPUを浮動小数点のみで利用する代わりにコンパイラーにエミュレートさせます(FPUはすべてのプラットフォームで必要なわけではありません。実際、Cortex-M4アーキテクチャーはオプション機能としてそれらを定義します[M2はタイプミスですか?] )。
セラリアドボール14

その論理の鍵は、それが本当は浮動小数点演算にうんざりしているはずであるが、多くの「奇妙な」ことである。浮動小数点数は、一般に倍精度よりも高速であり、メモリの消費量も少なくなります(FPU機能は異なります)。使用量により、このポイントが時期尚早な最適化から除外されます。事実として、多くの(おそらくほとんどの)アプリケーションにとって、倍増は明らかに過剰です。このページの要素は、相対的な位置とサイズを小数点以下13桁まで計算する必要が本当にありますか?
セラリアドボール14

2
オフサイトのページまたはドキュメントへのリンクを含める場合は、関連する情報または概要をドキュメントから回答にコピーしてください。オフサイトリンクは、時間の経過とともに消える傾向があります。
アダムザッカーマン14

3

実際の問題では、この質問に答えるときにデータのサンプリングしきい値が重要です。同様に、ノイズフロアも重要です。データ型の選択でどちらかを超えた場合、精度を上げてもメリットはありません。

ほとんどの実際のサンプラーは24ビットDACに制限されています。仮数が24ビットの精度である場合、実世界の計算では32ビットの精度で十分であることを提案します。

倍精度には、メモリが2倍かかります。したがって、フロートでのdoubleの使用を制限すると、実行中のアプリケーションのメモリフットプリント/帯域幅が大幅に削減される可能性があります。


-3

floatとdoubleの間で使用する変数の選択は、必要なデータの精度に依存します。回答が実際の回答との差がごくわずかである必要がある場合、必要な小数点以下の桁数が多くなるため、その倍数を使用する必要があります。


3
この回答は、質問に新しいものを追加するものではなく、実際に使用するものを言うことに失敗します。
マーティンピーターズ

-5

通常、float型を使用するのは、お金などのためにあまり精度が必要でない場合です。

一方、double複雑な数学的アルゴリズムなど、より高い精度が必要な場合に使用します。

C99標準では次のように記述されています。

浮動小数点型には、float、double、およびlong doubleの3つがあります。double型は少なくともfloatと同じ精度を提供し、long double型は少なくともdoubleと同じ精度を提供します。float型の値のセットは、double型の値のセットのサブセットです。double型の値のセットは、long double型の値のセットのサブセットです。

私は実際に使用long doubleしたことはありませんが、C / C ++はあまり使用していません。通常、Pythonのような動的に型付けされた言語を使用します。ここでは、型を気にする必要はありません。

詳細についてはフロートVSダブル、参照SOでこの質問を


25
深刻なお金の計算に浮動小数点を使用することは、おそらく間違いです。
バートヴァンインゲンシェナウ

17
浮動小数点数は、お金のために正確に間違った型です。可能な限り最高の精度を使用する必要があります。
ChrisF

8
@BartvanIngenSchenauお金のための浮動小数点は通常大丈夫ですが、バイナリ浮動小数点はそうではありません。たとえば、.net Decimalは浮動小数点型であり、通常はお金の計算に適しています。
CodesInChaos

13
@ChrisFお金のために「高精度」は必要ありません。正確な値が必要です。
ショーンマクサムシング

2
@SeanMcSomething-フェアポイント。ただし、フロートは依然として間違った型であり、ほとんどの言語で使用可能な浮動小数点型を考えると、「正確な値」を取得するには「高精度」が必要です。
ChrisF
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.