プログラミングの経験では、実際にfloatを使用するかdoubleを使用するかを決定する必要があります。数字。フロートに行くこともあれば、ダブルに行くこともありますが、実際にはこれはより主観的に感じます。私が自分の決定を擁護するために直面するのであれば、私はおそらく正当な理由を与えないでしょう。
いつフロートを使用し、いつダブルを使用しますか?常にdoubleを使用しますか?メモリの制約が存在する場合にのみ、floatを使用しますか?または、精度要件でdoubleを使用する必要がない限り、常にfloatを使用しますか? floatとdoubleの間で、基本的な算術演算の計算の複雑さに関していくつかの実質的な違いはありますか? floatまたはdoubleを使用することの長所と短所は何ですか?また、long doubleを使用したこともありますか?
コメント
- 多くの場合、どちらも使用せず、10進数の浮動小数点型または固定小数点型を使用します。バイナリ浮動小数点型は、’ほとんどの小数を正確に表すことができません。
- に関連する浮動小数点の丸め誤差の原因?。 @CodesInChaos 私の答えは、その決定を下すのに役立つリソースを提案しています。万能の解決策はありません。
- “小数”とはどういう意味ですか。 0.01のような値を正確に表す必要がある場合(たとえば、お金のために)、(バイナリ)浮動小数点は答えではありません。単に整数以外の数値を意味する場合は、浮動小数点で問題ない可能性がありますが、”小数”は最適な単語ではありません必要なものを説明するために。
- (今日の時点で)ほとんどのグラフィックスカードは倍精度浮動小数点数を受け入れることを考えると、グラフィックスプログラミングは単精度を使用することがよくあります。
- 使用しない’常に選択肢があります。たとえば、Arduinoプラットフォームでは、doubleとfloatの両方がfloatに相当します。実際のdoubleを処理するには、アドインライブラリを見つける必要があります。
回答
浮動小数点型はdouble
である必要があります。これは、接尾辞のない浮動小数点リテラル、または(Cでは)浮動小数点数を操作する標準関数(exp
、など)。
float
は、多くの浮動小数点数を操作する必要がある場合にのみ使用してください(数千以上のオーダー)およびアルゴリズムの分析により、範囲と精度の低下は問題を引き起こさないことが示されています。
long double
は、次の場合に使用できます。 double
よりも広い範囲または精度が必要であり、ターゲットプラットフォームでこれを提供する場合。
要約すると、float
とlong double
はスペシャリストが使用するために予約し、double
は「毎日」使用するために予約する必要があります。
コメント
- 浮動小数点cachinに関連するパフォーマンスの問題がない限り、おそらく数千の値に対してfloatを考慮しないでしょう。 gとデータ転送。通常、フロートが十分に正確であることを示すために分析を行うにはかなりのコストがかかります。
- 補遺として、他のシステムとの互換性が必要な場合は、同じデータ型を使用すると有利な場合があります。
- I ‘ dは、1000ではなく、数百万の数値にフロートを使用します。また、一部のGPUはフロートをより適切に使用します。その特殊なケースでは、フロートを使用します。それ以外の場合は、あなたが言うように、doubleを使用します。
- @ PatriciaShanahan- ‘関連するパフォーマンスの問題.. ‘ A良い例は、SSE2または同様のベクトル命令を使用することを計画している場合、floatで4 ops / vectorを実行でき(2倍あたり2に対して)、大幅な速度の向上(読み取りの半分の操作と半分のデータ)を提供できます&書き込み)。これにより、浮動小数点数の使用が魅力的になるしきい値を大幅に下げることができ、数値の問題を整理するのに苦労する価値があります。
- この回答を1つの追加アドバイスで支持します。表示用にRGB値を使用している場合、
float
(場合によっては半精度)を使用することは許容されます。これは、人間の目、ディスプレイ、またはカラーシステムのいずれにもそれほど多くのビットの精度がないためです。このアドバイスは、OpenGLなどに適用されます。この追加のアドバイスは、より厳しい精度要件を持つ医用画像には適用されません。
回答
最近のコンピューターを対象とするコードでは、doubleではなくfloatを使用することはめったにありません。余分な精度により、丸め誤差やその他の不正確さが問題を引き起こす可能性が減少します(ただし、排除されるわけではありません)。
floatを使用すると考えられる主な理由は、次のとおりです。
- 多数の数値を格納しているため、プログラムのメモリ消費量を削減する必要があります。
- 倍精度浮動小数点をネイティブにサポートしていないシステムをターゲットにしています。最近まで、多くのグラフィックカードは単精度浮動小数点のみをサポートしていました。浮動小数点のサポートも制限されている低電力の組み込みプロセッサもたくさんあると思います。
- 単精度が倍精度よりも高速で、アプリケーションが頻繁に使用するハードウェアをターゲットにしています。最新のIntelCPUでは、すべての浮動小数点計算が倍精度で行われると思います。そのため、ここでは何も得られません。
- たとえば、一度に複数の数値を操作する特別なCPU命令を使用するなど、低レベルの最適化を行っています。
つまり、基本的に、doubleはハードウェアの制限がない限り、または倍精度数の格納がメモリ使用量に大きく貢献していることが分析で示されていない限り、行ってください。
コメント
- “最新のコンピューター”はIntelx86プロセッサーを意味します。エンシェントが使用したマシンのいくつかは、基本的なフロートタイプで完全に十分な精度を提供しました。 (CDC 6600は、60ビットワード、48ビットの正規化浮動小数点仮数、12ビットの指数を使用しました。’は、x86が倍精度で提供するものとほぼ同じです。)
- @ John.R.Strohm:同意しましたが、CコンパイラはCDC6600に存在しませんでした。それはFortranIVでした…
- “最新のコンピューター”過去10年間に構築されたプロセッサーを意味しますIEEE浮動小数点標準が広く実装されていたので、1つか2つ、または実際に。私は’ x86以外のアーキテクチャが存在することを完全に認識しており、私の答えを念頭に置いていました。GPUと組み込みプロセッサについて言及しましたが、通常はx86ではありません。
- しかし、’は単に真実ではありません。 SSE2は1回の操作で4つのフロートまたは2つのダブルを操作でき、AVXは8つのフロートまたは4つのダブルを操作でき、AVX-512は16のフロートまたは8つのダブルを操作できます。あらゆる種類のハイパフォーマンスコンピューティングの場合、floatでの計算は、x86でのdoubleでの同じ操作の2倍の速度と考える必要があります。
- そしてそれは’ sそれよりもさらに悪いことに、doubleの場合の2倍の数のfloatをプロセッサキャッシュに収めることができ、メモリレイテンシが多くのプログラムの主なボトルネックになる可能性があります。ワーキングセット全体をキャッシュ内でウォームに保つことは、doubleを使用してRAMに流出させるよりも、文字通り1桁高速である可能性があります。
回答
すべての計算と一時変数にdouble
を使用します。数値の配列を維持する必要がある場合は、float
を使用します-float[]
(精度が十分な場合)、数十を超える数を処理している場合何千ものfloat
の数値。
多くの/ほとんどの数学関数または演算子はdouble
を変換/返します。中間ステップのために、数値をfloat
にキャストし直したい。
たとえば、ファイルまたはストリームから100,000の数値を入力し、それらを並べ替え、番号をfloat[]
に入れます。
回答
一部のプラットフォーム(ARM Cortex-M2、Cortex-M4など)は double をサポートしていません(リファレンスマニュアルでいつでも確認できます)コンパイルの警告やエラーがない場合でも、コードが最適であるとは限りません。 double をエミュレートできます。 。)。そのため、 int またはフロート
。
そうでない場合は、 double を使用します。
D. Goldbergによる有名な記事(「すべてのコンピューター科学者が浮動小数点演算について知っておくべきこと」)を確認できます。浮動小数点演算を使用する前に、よく考えてください。特定の状況では、それらがまったく必要ない可能性がかなりあります。
http://perso.ens-lyon.fr/jean-michel.muller/goldberg.pdf
コメント
- この質問は1年前にすでにかなりよく答えられていました…ただし、いずれにせよ、’ ‘倍精度FPUアクセラレーションを備えたプラットフォームでdoubleを使用している場合は、いつでも使用する必要があります。それ以外の場合は、浮動小数点のみのFPUを利用する代わりに、コンパイラにエミュレートさせることを意味します(FPU ‘は’すべてのプラットフォームで必要です。実際、Cortex-M4アーキテクチャでは、これらをオプション機能として定義しています[M2はタイプミスでしたか?])。
- そのロジックの鍵は、 ‘本当の人は浮動小数点演算にうんざりしているはずであり、’多くの” quirks “、doubleのFPUサポートが存在しないことは、floatの代わりにdoubleを使用することを意味します。フロートは一般的にダブルよりも高速で、メモリの消費も少なくなります(FPUの機能は異なります)。使用量が多いため、この点が時期尚早に最適化されることはありません。事実がそうであるように、多くの(おそらくほとんどの)アプリケーションにとって、doubleは明らかにやり過ぎです。このページの要素は、実際に相対的な位置とサイズを小数点以下13桁まで計算する必要がありますか?
- オフサイトのページまたはドキュメントへのリンクを含める場合は、ドキュメントから回答への関連情報または要約。オフサイトリンクは時間の経過とともに消える傾向があります。
回答
実際の問題の場合、この質問に答えるとき、あなたのデータは重要です。同様に、ノイズフロアも重要です。データ型の選択がどちらかを超えた場合、精度を上げてもメリットはありません。
ほとんどの実際のサンプラーは、24ビットDACに制限されています。仮数が24ビットの精度である場合、実世界の計算では32ビットの精度で十分であることを示唆しています。
倍精度には、2倍のメモリが必要です。したがって、floatでのdoubleの使用を制限すると、実行中のアプリケーションのメモリフットプリント/帯域幅が大幅に削減される可能性があります。
回答
floatとdoubleの間で使用する変数は、必要なデータの精度によって異なります。回答が実際の回答とごくわずかな違いを持つ必要がある場合、必要な小数点以下の桁数が多くなるため、そのdoubleを使用する必要があります。浮動小数点数は小数点以下の一部を切り落として、精度を低下させます。
コメント
- この回答は’質問に新しいものを追加せず、実際の使用については何も述べていません。
回答
通常、私はfloat
タイプを使用します。精度はそれほど必要ありません—たとえば、お金のために—間違っていますが、これは私が間違って行っていたものです。
一方、私は複雑な数学的アルゴリズムなど、より高い精度が必要な場合。
C99標準では次のように述べられています:
浮動小数点タイプには、float、double、およびlongdoubleの3つがあります。 double型は、少なくともfloatと同じ精度を提供し、long double型は、少なくともdoubleと同じ精度を提供します。 float型の値のセットは、double型の値のセットのサブセットです。 double型の値のセットは、longdouble型の値のセットのサブセットです。
実際にですが、C / C ++はあまり使用していません。通常、Pythonのような動的に型指定された言語を使用しているため、型を気にする必要はありません。
Double vs Float の詳細については、この質問をSO で参照してください。
コメント
- 深刻なお金の計算に浮動小数点を使用するのはおそらく間違いです。
- 浮動小数点はお金に対してまったく間違ったタイプです。可能な限り最高の精度を使用する必要があります。
- @BartvanIngenSchenau通常、お金のための浮動小数点は問題ありませんが、バイナリ浮動小数点は問題ありません。たとえば、.net ‘の
Decimal
は浮動小数点型であり、通常は’です。お金の計算に適しています。 - @ChrisF ‘高精度の”は必要ありません”お金のために、正確な値が必要です。
- @ SeanMcSomething-フェアポイント。ただし、浮動小数点数は依然として間違った型であり、ほとんどの言語で使用可能な浮動小数点型を考えると、”高精度”を取得する必要があります”正確な値”。