質問

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

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

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

役に立ちましたか?

解決

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

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

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

他のヒント

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

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

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

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

第三に、一連の計算を実行するとき、たとえばループ内で、不正確な計算を処理するときは何をしているのかを知る必要があります。精度の度合い。これらの問題を詳細に理解するには、数値分析のコースが必要になる場合があります。これは、計算にfloatまたはdoubleを選択するかどうかには依存しません。

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

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

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

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

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

実際には、別名フロートを使用することはまだ一般的です。 「単精度」 32ビット:グラフィックアプリケーションと印刷。

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

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

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

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

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

サイズの削減(8ではなく4バイト)は、非常に大きなデータセットを扱う場合に重要になります(また、サイズの削減は、通常、キャッシュなどのためにパフォーマンスを向上させます)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top