C ++で一方を他方の代わりに使用することの長所と短所は何ですか?
回答:
真の答えを知りたい場合は、すべてのコンピューター科学者が浮動小数点演算について知っておくべきことを読む必要があります 。
要するに、その表現のより高い精度をdouble
可能にしますが、特定の計算では、より大きなエラーが発生します。「正しい」選択とは、必要な精度を使用し、それ以上は使用せず、適切なアルゴリズムを選択することです。。
多くのコンパイラは、とにかく「非厳密」モードで拡張浮動小数点演算を実行します(つまり、ハードウェアで使用可能なより広い浮動小数点型を使用します。たとえば、80ビットおよび128ビット浮動小数点)。これも考慮に入れる必要があります。実際には、速度の違いはほとんどわかりません。いずれにせよ、ハードウェアのネイティブです。
double
-ほとんどの場合、より安全です。
特に理由がない限り、doubleを使用してください。
おそらく驚くべきことに、C(およびC ++)の「通常の」浮動小数点型であるのはdoubleであり、floatではありません。sinやlogなどの標準的な数学関数は、doubleを引数として取り、doubleを返します。3.14を書くときのように、通常の浮動小数点リテラルプログラムでの型はdoubleです。浮かない。
典型的な最近のコンピューターでは、doubleはfloatと同じかそれ以上の速さである可能性があるため、大規模な計算であっても、パフォーマンスは通常考慮すべき要素ではありません。(そして、それらは大規模な計算である必要があります。さもないと、パフォーマンスが頭に浮かぶことはありません。私の新しいi7デスクトップコンピューターは、1秒間に60億倍の倍増を実行できます。)
質問のコンテキストがないため、この質問に答えることは不可能です。選択に影響を与える可能性のあるものは次のとおりです。
float、double、およびlongdoubleのコンパイラ実装。C ++標準は次のように述べています。
浮動小数点には、float、double、longdoubleの3つのタイプがあります。double型は、少なくともfloatと同じ精度を提供し、long double型は、少なくともdoubleと同じ精度を提供します。
したがって、3つすべてをメモリ内で同じサイズにすることができます。
FPUの存在。すべてのCPUにFPUがあるわけではなく、浮動小数点タイプがエミュレートされることもあれば、浮動小数点タイプがサポートされないこともあります。
FPUアーキテクチャ。IA32のFPUは内部で80ビットです-32ビットと64ビットのフロートはロード時に80ビットに拡張され、ストアで削減されます。4つの32ビットフロートまたは2つの64ビットフロートを並列に実行できるSIMDもあります。SIMDの使用は標準で定義されていないため、SIMDを使用できるかどうかを判断するために、より複雑な分析を行うコンパイラが必要になるか、特別な関数(ライブラリまたは組み込み関数)を使用する必要があります。80ビットの内部フォーマットの結果は、データがRAMに保存される頻度に応じて、わずかに異なる結果が得られる可能性があることです(したがって、精度が低下します)。このため、コンパイラは浮動小数点コードを特に適切に最適化しません。
メモリ帯域幅。doubleがfloatよりも多くのストレージを必要とする場合、データの読み取りに時間がかかります。それは素朴な答えです。最新のIA32では、データの送信元によって異なります。L1キャッシュにある場合、データが単一のキャッシュラインからのものであれば、負荷はごくわずかです。複数のキャッシュラインにまたがる場合、わずかなオーバーヘッドがあります。L2からの場合は時間がかかり、RAMにある場合はさらに長くなり、最後にディスクにある場合は非常に時間がかかります。したがって、floatまたはdoubleの選択は、データの使用方法ほど重要ではありません。大量のシーケンシャルデータに対して小さな計算を実行する場合は、小さなデータ型をお勧めします。小さなデータセットで多くの計算を行うと、大きなデータ型を使用して大きな効果を得ることができます。もし、あんたが' 非常にランダムにデータに再アクセスする場合、データサイズの選択は重要ではありません。データはページ/キャッシュラインにロードされます。したがって、RAMから1バイトだけが必要な場合でも、32バイトを転送することができます(これはシステムのアーキテクチャに大きく依存します)。これらすべてに加えて、CPU / FPUはスーパースカラー(別名パイプライン)である可能性があります。そのため、ロードに数サイクルかかる場合でも、CPU / FPUは、ロード時間をある程度隠す他の何か(たとえば乗算)を実行するのに忙しい可能性があります。
この標準では、浮動小数点値に特定の形式を適用していません。
仕様がある場合は、それが最適な選択につながります。それ以外の場合は、何を使用するかを経験する必要があります。
Doubleの方が正確ですが、8バイトでコーディングされています。floatはわずか4バイトであるため、スペースと精度が低下します。
アプリケーションにdoubleとfloatがある場合は、十分に注意する必要があります。過去にそれが原因でバグがありました。コードの一部はfloatを使用し、残りのコードはdoubleを使用していました。doubleをfloatにコピーしてから、floatをdoubleにコピーすると、精度エラーが発生し、大きな影響を与える可能性があります。私の場合、それは化学工場でした...うまくいけば、劇的な結果をもたらさなかったでしょう:)
アリアン6ロケットが数年前に爆発したのは、このようなバグのせいだと思います!!!
変数に使用する型について慎重に検討してください
適切な結果を達成するために必要な精度を使用してください。その後、コードが期待どおりに機能していないことがわかった場合(プロファイリングを正しく使用しましたか?)、次を確認してください。
doubleの方が精度が高くなりますが、floatはメモリの使用量が少なく、高速です。一般に、十分に正確でない場合を除いて、floatを使用する必要があります。