web-dev-qa-db-ja.com

いつfloatを使用し、いつdoubleを使用しますか

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

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

199
Jakub Zaverka

浮動小数点型のデフォルトの選択はdoubleです。これは、接尾辞なしの浮動小数点リテラル、または浮動小数点数を操作する(Cの)標準関数(expsinなど)で取得できるタイプでもあります。

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

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

要約すると、floatおよびlong doubleは専門家が使用するために予約しておく必要があり、doubleは「毎日」使用するためのものです。

191

最近のコンピューターを対象とするコードでは、doubleではなくfloatを使用する原因はめったにありません。精度を上げると、丸め誤差やその他の不正確さが原因で問題が発生する可能性が低くなります(ただし、なくなるわけではありません)。

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

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

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

42
user611910

すべての計算と一時変数にdoubleを使用します。数値の配列を維持する必要がある場合はfloatを使用してください-float[](精度が十分な場合)、数万を超えるfloatの数値を処理しています。

多くの/ほとんどの数学関数または演算子はdoubleを変換/返すため、途中のステップで数値をfloatにキャストしたくない場合。

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

10
Fai Ng

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

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

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

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

5
staroselskii

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

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

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

3
user3034617