私の最初の答え(4年前から)は、決定がなされた文脈を理解することなく、現代の観点から決定を批判しています。このように、それは質問に答えません。
正解はここにあります:
NaN
!= NaN
2つの実用的な考慮事項から生じました:
[...] isnan( )
NaNが8087算術で形式化された時点では、述語はありませんでした。プログラミング言語に依存せず、isnan( )
何年もかかる可能性のあるようなものを提供するNaN値を検出する便利で効率的な手段をプログラマーに提供する必要がありました。
このアプローチには1つの欠点がありました。それは、数値計算とは関係のない多くの状況でNaNの有用性が低下したことです。たとえば、ずっと後になって、人々がNaN
欠落している値を表現し、それらをハッシュベースのコンテナに入れたいと思ったとき、彼らはそれを行うことができませんでした。
委員会が将来のユースケースを予見し、それらが十分に重要であると考えた場合、それらはのテストとしてでは!(x<x & x>x)
なく、より冗長なものに移行することができたはずです。しかし、彼らの焦点はより実用的で狭いものでした。数値計算に最適なソリューションを提供するため、アプローチに問題はありませんでした。x!=x
NaN
===
元の答え:
申し訳ありませんが、トップ投票の回答に寄せられた考えに感謝しますが、私はそれに同意しません。NaNは「未定義」を意味するものではありません。7ページのhttp://www.cs.berkeley.edu/~wkahan/ieee754status/IEEE754.PDFを参照してください(「未定義」という単語を検索してください)。そのドキュメントが確認しているように、NaNは明確に定義された概念です。
さらに、IEEEのアプローチは、可能な限り通常の数学の規則に従うことでした。それができなかった場合は、「驚き最小の原則」の規則に従います。https://stackoverflow.com/a/1573715/336527を参照してください。すべての数学的対象はそれ自体と等しいので、数学の規則は、NaN==NaNが真でなければならないことを意味します。そのような主要な数学的原理から逸脱する正当で強力な理由はわかりません(比較の三分法などのそれほど重要ではない規則は言うまでもありません)。
その結果、私の結論は次のようになります。
IEEE委員会のメンバーは、これを明確に考えていなかったため、間違いを犯しました。IEEE委員会のアプローチを理解したり、NaNについて標準が正確に何を言っているかを気にかけている人はほとんどいなかったので(つまり、ほとんどのコンパイラによるNaNの扱いはIEEE標準に違反しています)、誰も警告を発しませんでした。したがって、この間違いは現在、標準に組み込まれています。このような修正は既存のコードの多くを壊してしまうため、修正される可能性は低いです。
編集:これは非常に有益な議論からの1つの投稿です。注:Guidoは他のコア開発者とは異なる見方をしているため、偏りのない見方を得るには、スレッド全体を読む必要があります。ただし、Guidoはこのトピックに個人的に興味を持っておらず、TimPetersの推奨事項にほぼ従っています。ティム・ピーターズの主張に賛成する人がいる場合はNaN != NaN
、コメントに追加してください。彼らは私の意見を変える良いチャンスがあります。