47

興味があるのですが、IEEE-754ゼロ以外の浮動小数点数をゼロで割った結果が無限の値になるのはなぜですか? 数学的な観点からはナンセンスです。したがって、この操作の正しい結果は NaN だと思います。

関数 f(x) = 1/x は、x が実数の場合、x=0 のときに定義されません。たとえば、関数 sqrt は負の数に対して定義されておらず、値IEEE-754を生成する場合は sqrt(-1.0f) です。NaNしかし、1.0f/0 はInf.

しかし、何らかの理由でこれは当てはまりませんIEEE-754。これには理由があるに違いありません。最適化または互換性の理由かもしれません。

それで、ポイントは何ですか?

4

4 に答える 4

64

数学的な観点からはナンセンスです。

はい。いいえ。

問題は、浮動小数点数は近似値です。広範囲の指数と限られた桁数を使用して、完全に間違っていない結果を得たいと考えています。:)

IEEE-754 の背後にある考え方は、すべての操作が問題の可能性を示す「トラップ」をトリガーできるというものです。彼らです

  • 違法(負の数の平方根のような意味のない演算)
  • オーバーフロー (大きすぎる)
  • アンダーフロー (小さすぎる)
  • ゼロ除算(嫌いなもの)
  • 不正確 (精度が失われているため、この操作は間違った結果をもたらす可能性があります)

現在、科学者やエンジニアなどの多くの人々は、トラップ ルーチンの作成に煩わされることを望んでいません。そのため、IEEE-754 の発明者である Kahan は、トラップ ルーチンが存在しない場合、すべての操作が適切なデフォルト値を返す必要があると判断しました。

彼らです

  • 不正な値の NaN
  • オーバーフローの符号付き無限大
  • アンダーフローの符号付きゼロ
  • 不確定な結果 (0/0) の場合は NaN、(x/0 x != 0) の場合は無限大
  • 不正確な場合の通常の操作結果

問題は、すべてのケースの 99% でアンダーフローが原因でゼロが発生するため、数学的な観点からは間違っていても、99% の場合、Infinity は「正しい」ということです。

于 2013-02-04T10:09:39.897 に答える
10

なぜあなたがこれをナンセンスだと信じるのか、私にはわかりません。

の単純化された定義はa / b、少なくともゼロ以外の場合、ゼロになる前に減算する必要がある s のb一意の数です。ba

それをゼロになることができるケースに拡張すると、ゼロに到達することは決してないbため、ゼロ以外の数値からゼロに到達するために減算する必要がある数値は実際に無限です。

それを見る別の方法は、制限の観点から話すことです。正の数nがゼロに近づくと、式1 / nは「無限大」に近づきます。私は無限が実際には具体的な数であるという妄想を広めないことを固く信じているので、私がその言葉を引用したことに気付くでしょう:-)

NaN数が他の値 (無限大を含む) で (おおよそでも) 表現できない状況のために予約されており、他のすべての値とは異なると見なされます。

たとえば、0 / 0(上記の単純化された定義を使用して)からs を引くと 0 になります。したがって、結果は不確定です - 1、7、42、3.14159、またはその他の値になる可能性がありますba

同様に、負の数の平方根のようなものは、IEEE754 で使用される実平面では値を持たず (そのためには複素平面に移動する必要があります)、表現できません。

于 2013-02-04T07:22:54.713 に答える