web-dev-qa-db-ja.com

なぜdouble over over、またはdouble over long doubleを使用するのですか?

私はまだプログラミングの初心者であり、私が本やインターネット検索で答えることができる以上の質問が常にあります(何かを見逃さない限り)。それで、これが答えられたけれども、私はそれを見つけることができなかったならば、私は前もって謝罪します。

Floatはdoubleよりも範囲が狭いため、精度が低くなることを理解しています。また、私が理解していることから、long doubleはさらに正確です(?)。だから、私の質問は、なぜあなたはそもそも精度の低い変数を使用したいのですか?異なるプラットフォーム、異なるOSバージョン、異なるコンパイラと関係がありますか?または、プログラミングで、double/long doubleよりもfloatを使用する方が戦略的に有利な特定の瞬間がありますか?

みんな、ありがとう!

20
floatfil

ほぼすべてのプロセッサで、「より小さい」浮動小数点数の実行にかかるクロックサイクルは同じかそれ以下です。違いはそれほど大きくない(またはまったくない)場合もあれば、doublefloatのサイクル数が文字通り2倍になる場合もあります。

もちろん、キャッシュ使用量に影響を与えるメモリフットプリントも要因になります。 floatdoubleの半分のサイズを取り、long doubleはさらに大きくなります。

編集:小さいサイズのもう1つの副作用は、プロセッサのSIMD拡張機能(3DNow!、SSE、x86のAVX、および他のいくつかのアーキテクチャで利用可能な同様の拡張機能)がfloatでのみ動作するか、 floatdoubleの2倍(そして、私が知る限り、どのプロセッサーでもlong doubleに使用できるSIMD命令はありません)。そのため、floatを使用する場合とdoubleを使用する場合、一度に2倍のデータを処理することにより、パフォーマンスが向上する場合があります。編集を終了します。

したがって、6〜7桁の精度で必要なものが十分であり、+ /-10の範囲であると仮定します。+/- 38 十分であれば、floatを使用する必要があります。数字の桁数を増やすか、範囲を広げる必要がある場合は、doubleに移動し、それでも十分でない場合は、long doubleを使用します。ただし、ほとんどの場合、doubleで十分です。

明らかに、「適切なサイズ」を使用することの重要性は、多くの計算または処理するデータがある場合により重要になります-5つの変数があり、プログラムでそれぞれ数回使用する場合他の何百万もの、誰が気にしますか?フォーミュラ1の車が200 mphでどれだけうまく動いているかの流体力学計算をしている場合、おそらく数千万のデータポイントを計算する必要があり、すべてのデータポイントは1秒間に何十回も走行する必要がありますが、各計算で数クロックサイクルだけ余分に使用すると、シミュレーション全体が著しく長くなります。

26
Mats Petersson

フロートの使用には2つのコストがあります。それは、その範囲と精度が限られていることの明らかなものであり、それらの制限が課す分析の難しさは明らかです。

浮動小数点数が十分であることを示すのにかなりの数値解析の努力が必要な場合でも、倍精度で十分であると判断するのは比較的容易です。これにより、開発コストが削減され、より困難な分析が正しく行われない場合の誤った結果のリスクが軽減されます。

多くのプロセッサでのフロートの最大の利点は、メモリフットプリントの削減です。これは、キャッシュラインあたりの数値が増え、1秒間に転送される数値の面でメモリ帯域幅が増えます。計算パフォーマンスの向上は通常比較的わずかです-実際、一般的なプロセッサーはすべての浮動小数点演算を2倍よりも広い1つの形式で実行します。

2つの条件が満たされない限り、doubleを使用するのが最善のようです。メモリフットプリントが重大なパフォーマンスの問題になるのに十分な数があり、開発者はfloatが十分に正確であることを示すことができます。

5

あなたはここに投稿された答えを見ることに興味があるかもしれません doubleまたはfloatを使用すべきですか?

ただし、特定の状況に必要な精度の量に対するメモリフットプリントに要約されます。物理エンジンでは、精度を重視する場合があるため、doubleまたはlong doubleを使用する方が理にかなっています。

結論:特定のアルゴリズムに必要な精度だけを使用する必要があります

2
Paul Renton

ここでの基本原則は、必要以上に使用しないことです。

最初の考慮事項はメモリの使用です。たった1つだけのダブルを大したことではないのに、すでに2倍のメモリスペースを使用した場合よりも10億を作成した場合は、すでに気付いているでしょう。

次はプロセッサの使用率です。多くのプロセッサでは、より小さなデータ型を使用すると、一度に複数の操作を実行するスレッド形式を実行できます。

したがって、答えのこの部分の拡張は SSE命令 です。これにより、基本的に packed data を使用して、複数の浮動小数点演算を一度に実行できます。これは idealized caseは、プログラムの速度を2倍にできます。

最後に、読みやすさです。フロートを使用すると、誰かがコードを読んでいるときに、特定の数を超えていないことがすぐにわかります。 IMOは、コード内で適切な精度の数値が流れることがあります。

1
aaronman

Floatはdoubleよりも少ないメモリを使用するため、数値をdoubleのサイズにする必要がない場合は、floatを使用するとメモリが少なくなります。

バスを使用して自分自身や友人をビーチまで運転しないのと同じように、2人乗りの車で行く方がはるかに良いでしょう。

同じことが、倍精度の倍長整数にも当てはまります。必要なだけのメモリを予約してください。そうしないと、より複雑なコードでは、メモリを使いすぎてプロセスが遅くなったりクラッシュしたりするリスクがあります。

0