2017-08-05 13 views
0

私はこれらの操作に浮動小数点数を使用しています:精度を最大化する操作の順序

どちらがより正確ですか?

  • (* b)は/ C

または

  • (/ C)*

Bの問題は全くそれをしないか、に依存しません状況?もしそうなら、私はどのような場合に選択すべきですか?

+3

精度を気にする人は、ダブルスを使用しないでください。 –

+0

私は精密さを気にしますが、それほど大したものではありません。私は2つのうちの1つを使用することを余儀なくされているので、どちらが良いかを知りたいと思います。 – ZeroZ30o

+1

私は値によると思います。 'a * b'の結果がオーバーフロー(無限大)になった場合、それはあまり正確ではありません。 OTOHの場合、 'a/c'がアンダーフロー(非正規化、つまり0.0f)になり、精度は低くなります。また、 '(1/3)* 3'は'(1 * 3)/ 3'ほど正確ではありません。オーバーフローの可能性がない場合は、 'a * b/c'を使用します。 –

答えて

3

本当に、ダブルを使用しないと誤った方向になり、精度については気にしません。

それ以外の場合は、最初の結果が次に高い2の累乗よりわずかに低い場合は、エラーの範囲が最適になります。たとえば、e/sqrt(2)≒1.922が2未満で閉じるため、(π* e)/ sqrt(2)を計算すると、(e/sqrt(2))* piを計算することによって、 2つの次の高い電力への相対的な誤差はより低い。

多数の項目を加減算するには、最初に等しい大きさと反対の記号(x-yはy/2≦x≦2yの場合に正確に計算されます)を差し引き、できるだけ小さな結果。

+0

明確にするために、スピードと精度についてまず気にしています。 – ZeroZ30o

+0

浮動小数点は倍精度よりも速いのはなぜだと思いますか?これがおそらくそうでない理由については、https://stackoverflow.com/questions/4584637/double-or-float-which-is-fasterや他の多くの記事を参照してください。 –

+0

リンク先のポストに記載されているように、より多くのデータがCPUキャッシュをより速く満たすためです。 – ZeroZ30o

関連する問題