42

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

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

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

4

7 に答える 7

59

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

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

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

于 2009-01-02T20:53:36.090 に答える
12

すべての浮動小数点計算は一般的に不正確です。詳細については、すべてのコンピューター科学者が浮動小数点演算について知っておくべきことをお読みください。

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

于 2009-01-02T20:53:51.910 に答える
9

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

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

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

浮動小数点の計算では、浮動小数点よりも一般的で高速であるため、通常はdoubleを使用します。ただし、フロートは小さく、多くを保存する必要がある場合は、キャッシュミスによるパフォーマンスの問題を防ぐためにフロートを選択します。

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

于 2009-01-03T15:09:20.043 に答える
7

を使用したい場合が多くありますfloat。私が理解していないのは、代わりに使用できるものです。doubleの代わりに使用することを意味する場合はfloat、ほとんどの場合、そうする必要があります。ただし、double精度の問題もあります。decimal精度が重要な場合はいつでも使用する必要があります。

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

于 2009-01-02T20:50:10.840 に答える
6

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

于 2009-01-02T21:09:08.523 に答える
5

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

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

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

于 2009-02-20T17:45:15.753 に答える
3

パフォーマンスとサイズには float を使用します。精度の低下を管理できる場合。

最新のプロセッサが単精度演算と倍精度演算を処理するのに同じ時間がかかるのは事実ですが、SIMD (x86 では MMX/SSE など) 命令で float を使用すると、スループットが2 倍になることがあります。

SSE レジスタは 128 ビット幅で、4 つの floatまたは2 つの doubleを保持できます。したがって、正しく使用すれば、double と比較して 2 倍の操作を float で行うことができます。

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

于 2009-01-03T07:41:52.023 に答える