web-dev-qa-db-ja.com

フロートを使用する場合

何年か前に、フロートの精度の問題について難しい方法を学んだので、フロートの使用をやめました。ただし、フロートを使用してコードに実行すると、計算の一部が不正確になることがわかっているので、不快に感じます。

では、フロートを使用するのが適切なのはいつですか?

編集:情報として、数値の精度が重要ではないプログラムに出くわしたことはないと思います。しかし、私は例を聞くことに興味があります。

39
Papa Burgundy

簡単な答え:floatを使用する必要があるのは、自分が何をしていて、その理由が正確にわかっている場合だけです。

長い答え:floatsdoublesとは対照的に)は、私が知る限り、3D APIの外部では実際には使用されていません。 floatとdoubleは、最近のCPUで同じパフォーマンス特性を持ち、doubleはやや大きく、それですべてです。疑わしい場合は、doubleを使用してください。

もちろん、財務計算にはdecimalを使用します。

57
Tamas Czinege

浮動小数点の計算はすべて、一般的なケースでは不正確であり、浮動小数点数は倍精度浮動小数点数よりも多くなります。より多くの情報が必要な場合は、 浮動小数点演算についてすべてのコンピュータ科学者が知っておくべきこと をお読みください。

Floatをいつ使用するかについては、メモリの節約よりも精度の重要性が低いときによく使用されます。たとえば、ビデオゲームでの簡単なパーティクルシミュレーション。

11
U62

まず、10進数の値を正確に表現したい場合は、floatやdoubleを使用しないでください。整数型(int、longなど)またはdecimal(これはスケーリング係数を持つ単なる整数型)を使用してください。 floatとdoubleは、基数2の指数表現に内部的に変換され、基数10の指数表現で正確に表される数値は、一般に正確に表すことができません。 (たとえば、数値10は、浮動小数点数または倍精度浮動小数点数でのみ表されます)。

第二に、精度の点では、それはあなたが必要とするものに依存します。精度が重要ではない計算は決してないというあなたの意見には同意しません。通常、最終結果が3桁と正確であるという特定のニーズがあります。入力の精度が限られている場合、可能な限り最高の精度を探すことは意味がありません。たとえば、小麦粉の重量が5gで、秤の精度が0.5gしかない場合です。とはいえ、中間計算は通常、より高い精度の恩恵を受けますが、かなり頻繁に高速化する場合は、高精度よりも重要なものです。

第3に、一連の計算を実行するとき、たとえばループ内で、不正確な計算を処理するときに何をしているのかを知る必要があります-丸め誤差が発生し、一部のアルゴリズムはある程度の精度の答えに到達しない場合があります。これらの問題を詳細に理解するには、数値分析のコースが必要になる場合があります。これは、計算に浮動小数点数または倍精度数のどちらを選択するかには依存しません。

浮動小数点計算の場合、浮動小数点よりも一般的で高速なので、通常は倍精度浮動小数点を使用します。ただし、フロートはサイズが小さく、フロートの多くを格納する必要がある場合は、キャッシュミスによるパフォーマンスの問題を回避するためのフロートです。

私の知る限りでは、浮動小数点処理はdoubleのハードウェアでサポートされていますが、floatはサポートされていないため、floatを使用するとdoubleに変換されます。ただし、浮動小数点数を渡すときに反復的に値を計算すると、一部のルーチンはより早く停止します。これは、約8桁の精度が必要なのに対し、倍精度浮動小数点の約16桁しか必要ないことを意味するためです。

8
ILoveFortran

floatを使用したい場合がたくさんあります。しかし、私が理解できないのは、代わりに使用できるものです。 doubleの代わりにfloatを使用するつもりなら、そうです、ほとんどの場合、そうしたいと思います。ただし、doubleにも精度の問題があります。正確さが重要な場合は常にdecimalを使用する必要があります。

floatおよびdoubleは、多くのアプリケーションで非常に役立ちます。 decimalは高価なデータ型であり、その範囲(それが表すことができる最大数の大きさ)はdouble未満です。コンピュータは通常、これらのデータ型に対して特別なハードウェアレベルのサポートを備えています。彼らは使われています たくさん 科学計算で。基本的に、これらは使用する主要なフラクショナルデータタイプです。ただし、精度が非常に重要な通貨計算では、decimalが最適です。

7
Mehrdad Afshari

実際には、32ビットで「単精度」とも呼ばれる浮動小数点数を使用することが一般的である1つのことがあります。それは、グラフィックアプリケーションと印刷です。

もう1つの理由は、GPUを搭載したグラフィックカードです。データ型が小さいほど、転送する必要のあるビットが少なくなるため、操作が高速になります。整数データ型には、ハイダイナミックレンジの画像に問題があります。目は、1:10 ^ 13の明度範囲で機能し、ca。 4000レベル。したがって、整数データ型はレベルの数を格納できますが、フロートは問題ありませんが、背景の明るさを格納できません。実際、IEEE 754Rは、16ビットと10ビットの仮数を持つ新しい「半精度」浮動小数点数を許可します。これにより、ある程度の精度は失われますが、さらに高速になります。 OpenGLおよびDirectX(例:フロートを幅広く使用します。目はアーティファクトに非常に寛容なので、問題はありません。

グラフィックに基づいて構築されている他のすべてのメディアは、便利な手段としてフロートを継承しています。仮数には24ビットがあるため、2 ^ 24 = 1,700万の連続したステップが可能です。 2000 dpiの解像度のプリンタを使用している場合でも、213x213 mのシートを印刷できます。十分な精度以上。

5
TSK

私が考えることができる最も一般的な理由は、スペースを節約することです。これはしばしば心配する価値があるというわけではありませんが、場合によっては問題になります。 floatはdoubleの半分のメモリを使用するため、同じスペースで2倍のメモリを取得できます。たとえば、数値の配列が大きすぎてRAMに倍精度浮動小数点数としては収まらないが、配列の浮動小数点数としては収まる。

5
John D. Cook

フロートを使用 パフォーマンスとサイズ。精度の低下を管理できる場合。

最新のプロセッサが単精度演算と倍精度演算を処理するのに同じ時間を要することは事実ですが、SIMDで浮動小数点数を使用すると、twiceスループットが得られる場合があります(MMX/SSE /など) x86)手順。

SSEレジスターは128ビット幅で、4 floatsまたは2 doublesを保持できます。したがって、正しく使用すれば、倍精度浮動小数点数と比較して、倍精度浮動小数点数で2倍の演算を実行できます。

サイズの削減(8バイトではなく4バイト)は、非常に大きなデータセットを処理するときに重要になります(サイズの削減は、通常、キャッシュなどにより、パフォーマンスも向上します)。

3
nimrodm