6

「非正規化数」または「非正規化数」という用語を検索するときはいつでも、それらを検出してゼロに丸める方法しか見つかりません。どうやら、それらを扱うことはパフォーマンスのペナルティを招くので、誰もそれらを本当に好きではありません。

それでも、それらはどこにでも実装されています。なんで?精度を上げるためには、より大きなフロートが必要になるか、実際に小さい中間値を避けるように操作の順序を変更する必要があると思います。ほんの少しの精度が貴重なクロックサイクルの価値があるとは信じがたいです。

それでも非正規化数を使用する正当な理由はありますか?そして、非正規化数を持つ重要な理由がないのなら、なぜそれらを実装するのでしょうか?IEEE754に準拠するためだけですか?)

4

2 に答える 2

6

要するに、段階的なアンダーフローはいくつかの有用な数学的アイデンティティを保持するためです(たとえば、xy==0はx==yを意味します)。漸進的なアンダーフローが役立つ理由のいくつかの説明:

http://grouper.ieee.org/groups/754/faq.html#underflow

http://www.cs.berkeley.edu/~wkahan/ARITH_17U.pdf

もちろん、アプリケーションの設計が不適切なためにアンダーフローが発生する場合もあります。適切なアクションは、アプリケーションを修正することです。その他の場合、段階的なアンダーフローで正しく動作するアプリケーションは、突然のアンダーフローで失敗します。

さらに、

  • 多くの場合、低速であるが正しいと、高速であるが危険であるよりも適切なデフォルトと見なされます。

  • 漸進的なアンダーフローがデフォルトであるため、グーグルはそれについて不平を言い、それをオフにしたいと思っている人々を見つけます。OTOHの突然のアンダーフローがデフォルトだったとしたら、代わりに、不思議な数値の問題について不平を言う人が増えるのではないでしょうか。数値プログラミングはそれなりに難しいです!

  • 最新のハードウェアは、非正規化数での作業に対するペナルティを減らしました。たとえば、http ://www.agner.org/optimize/blog/read.php?i = 142&v=tを参照してください。

于 2012-05-14T12:59:29.143 に答える
3

非正規化数は非常に便利です。浮動小数点の計算には、非正規化数を削除すると真ではなくなる有用なエラー範囲がいくつかあります(最も重要なのは、そのx-y == 0場合に限りますx == y)。

(a)非正規化数がすべてのハードウェアにペナルティを課すわけではないことを覚えておくことも重要です。非正規化数を高速で(またはそれに非常に近い速度で)処理できるシステムが存在し、(b)非正規化数は、実際に発生した場合にのみ計算の速度を低下させます。あなたがそれらを使用しない場合、あなたはそれらの代金を払わない(そしてあなたそれらを使用することになった場合、あなたの結果はそれらなしではおそらく間違っていたでしょう-あなたが単にできるだけ早く間違った答えを望むなら、あなたは計算全体をreturn 0)に置き換えることができます。

于 2012-05-14T13:03:33.003 に答える