web-dev-qa-db-ja.com

JavaScriptでは、ゼロをゼロで除算するとNaNが返されるのに、ゼロで除算した他の値がInfinityを返すのはなぜですか?

私にはコードが

console.log(1 / 0)

NaNを返す必要がありますが、代わりにInfinityを返します。ただし、このコード:

console.log(0 / 0)

does return NaN。誰かがこの機能の理由を理解するのを手伝ってくれますか? x / 0の場合、x !== 0の場合、矛盾しているように見えるだけでなく、間違っているようにも見えます。

45
Bloodyaugust

それは、浮動小数点が定義される方法だからです(より一般的にはJavascriptよりも)。例を参照してください:

おおまかに言って、xはゼロになる傾向があるので、1/0を1/xの限界と考えることができます。また、0/0には合理的な解釈がまったくないため、NaNです。

34

ゼロという数学的概念に基づいた回答に加えて、浮動小数点数には特別な考慮事項があります。アンダーフローの結果、ゼロ以外の数値として表現するには絶対値が小さすぎるゼロ以外の数値はすべて、ゼロとして表されます。

0/0は実際には1e-500/1e-600、1e-600/1e-500、または他の非常に小さな値の多くの比率です。

実際の比率は何でもかまいません。したがって、意味のある数値的な答えはなく、結果はNaNになります。

次に、1/0を検討します。 0が1e-500を表すか1e-600を表すかは関係ありません。いずれにしても、除算はオーバーフローし、正しい結果はオーバーフローを表すために使用される値Infinityです。

9

私はこれが古いことを理解していますが、JSにはこの機能をより論理的にする-0または0とは異なる+0もあることに注意することが重要だと思います一目見ただけで。

1 / 0 -> Infinity
1 / -0 -> -Infinity 

計算では、0で除算する理由が定義されていないのは、左の制限が負の無限大に、右の制限が正の無限大になっているからです。 -00はJSの異なるオブジェクトであるため、正の0を適用して正のInfinityに評価し、負の0を適用して負のInfinityに評価することは理にかなっています

このロジックは、不確定な0/0には適用されません。 1/0とは異なり、このメソッドで0/0を使用すると、2つの結果を得ることができます。

lim h->0(0/h) = 0
lim h->0(h/0) = Infinity

もちろんこれは一貫性がないため、NaNになります

4