どちらを使うべきダブルまたはfloat?
-
21-08-2019 - |
質問
そのメリットとデメリットを一つの代わりにその他のC++?
解決
を知りたければ、真の回答お願いします どのコンピュータ科学者にとって知っておくべきこ浮動小数点演算.
短が double
を可能にす 高精度 その表現は、一定の計算で作 大きな誤差.に高層複合ビル"あべのハルカス"には: としてご利用く精度の必要がない。 や の選択アルゴリズム.
多くのコンパイラなの延長の浮動小数点数学"非厳密モードでもかまいませんが、結局(すなわち利用拡大の浮動小数点できるようにするには、そのハードウェアなど80ビットおよび128ビット浮動小数)この慮する必要がある。実際には、できる ほとんど見当違いの速度 --これらは原住民へのハードウェアます。
他のヒント
あなたがそうでなければ行うにはいくつかの特定の理由がない限り、ダブルを使用します。
おそらく驚くべきことに、それは二重であり、それはC(およびC ++)で「ノーマル」浮動小数点型で浮遊しません。などの標準的な数学関数の罪とログインの引数としてダブルスを取る、とダブルスを返します。文字通り、通常の浮動小数点、あなたのプログラムの中の 3.14 を書くときのように、二重のタイプがあります。浮くわけではありません。
典型的な現代のコンピュータでは、ダブルス山車と同じくらい速くすることができ、またはさらに高速なので、パフォーマンスは通常でも大規模な計算のために、考慮すべき要因ではありません。 (そして、それらはの大の計算でなければならないであろう、あるいはパフォーマンスもあなたの心を入力してはいけません。私の新しいi7のデスクトップコンピュータは、1秒間に倍増の60億回の乗算を行うことができます。)
この質問で答えがありませんのでコンテキストの問題をもたらしていました。ここではその選択肢:
コンパイラの実装float,double長が表示されます。C++の標準状態:
が浮動小数点タイプ:float、double、およびlong、double.タイプダブルルーとは少なくとも精度としてのfloatのタイプの長いダブルルーとは少なくとも精度としています。
なので、できることに同サイズ。
有FPU.ないすべてのCpu FPUs時の浮動小数点型エミュレーション時の浮動小数点タイプにも対応しておりません。
FPUのです。のIA32のFPUは80bitの内部で32ビットおよび64ビットのfloatを増80bit負荷の低減に関す。ものもありまSIMDが可能な四つの32bit floatは、64ビットのfloatを行なった。利用SIMDが定義されていないのに標準でなコンパイラはより複雑な分析をする場合SIMDに使用でき、またはを使用する必要がある特別な機能(図書館やintrinsics).を聞の80bit内部フォーマットができることをめざす若干異なる結果によってどのようなデータが保存されるのRAM(このような精度).このため、コンパイラでコンパイルな最適化浮動小数点コード中です。
メモリ帯域幅。場合はダブルが必要であり保管よりフロート、それにとって、データを読み出します。それがナイーブの答えです。現IA32でのデータ。の場合はチョークコイルL1キャッシュすればするほど負荷が軽減できる無視できる提供データから単一のキャッシュする。場合に及ぶ複数のキャッシュラインが小さいオーバーヘッド。だからL2,には時間がかかることがあり、の場合はRAM上での長が、最後に、の場合はディスクで大きます。その選択は、floatまたはdoubleの必要性が大きくなり、データを使用します。だいたい小さな計算のシーケンシャルデータは、小さなデータ型にすることが好ましい。たくさんの計算に小さなデータセットが利用できるようになります大きなデータの種類の重要な効果です。場へのアクセスデータをランダムに選択データのサイズが重要データの読み込みページ/キャッシュする。でもこのバイトからのRAMを取得しました32バイトを転送(非依存の建築のシステム)の上、これらすべてのCPU/FPUできるスーパースカラー(通称パイプライン).でも、負荷数サイクルのCPU/FPUが忙しいのやろうというの他(掛け算のためのインスタンス)が隠負荷の時間を。
の標準的な実施は、特定の形式のための浮動小数点値です。
とした場合の仕様では、そのままをご案内させていただき最適な選択肢と言えます。それ以外の場合の下での経験を生かし、何を利用します。
ダブルより正確であるが、8バイトに符号化されます。フロートは、4バイトなので、より少ない部屋と低い精度である。
アプリケーションでダブルフロートを持っている場合は、あなたは非常に注意しなければなりません。私は過去にそれに起因するバグがありました。コードの一部は、コードの残りの部分は、二重使用している間にフロートを使用していました。浮遊し、その後倍増するfloat型に二重のコピーが大きな影響を与える可能性があり精度誤差が発生する可能性があります。私の場合、それがうまくいけば、それは劇的な結果を持っていなかった...化学工場だった:)
私はそれが理由アリアン6ロケットは数年前に爆発したバグのこの種類のものであると思います!!!
変数に使用するタイプについて慎重に考えてみます。
私はいくつかのボトルネックが表示されるまで、私は個人的に二重のすべての時間のために行きます。その後、私は浮いて移動したり、他のいくつかの部分最適化を検討する。
このようにコンパイラを実装します。この法律のためのdouble、floatのタイプがとても親切で一部のシステム)だ。
とはいえば確かに異なり、主な問題については精度ダブルは強化することで、より高い精度のように違います。場合の数字を使用すれを超える価値をfloatに使用されます。
その他複数の人以上の性能isssues.がちょうどその前に私の一覧。正すべきである#1。
使用のいずれか高い精度が達成に必要な、適切な結果.場合データベース検索システムとコードいいただくことにより、手間としていない(使ったプロファイリングは正確ですか?) か
私は誰が今までの二重を使用して、パフォーマンスの問題に苦しむん...かかわらず(誰もが指摘するように、フロートが少ないスペースを取るし、より速く、一般的にある)差異のだと思いますか?私は二重の使用言う...と後であなたには判断した場合、「うわー、これは本当に遅いです」...(おそらくあなたは二重の使用事実ではありません)、あなたのパフォーマンスのボトルネックを見つけます。それはまだあなたのためにあまりにも遅いです場合は、いくつかの精度を犠牲にし、フロートを使用できる場所THEN、見ます。
これは、最も明白なトレードオフは、精度とメモリの間にあるCPUに大きく依存します。 RAMのGB単位で、メモリは、問題の多くはないので、それはdouble
sを使用することが一般的に良いでしょう。
の性能としては、それはCPUに大きく依存します。 float
sは通常、32ビットマシン上double
sよりも良好な性能が得られます。それは(通常は)天然のサイズであるので、64ビットで、double
sは、時々高速です。それでも、かどうか、あなたのプロセッサ上でSIMD命令を活用することができているデータ型の選択よりもはるかに多くの何が問題ではなります。
ダブルは、より高い精度を持っています。あなたはそれが十分に正確でない場合がある場合を除き、一般的に、あなたは、floatを使用する必要があります。