6
Python 2.7.3 (default, Aug  1 2012, 05:14:39) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> x = float('nan')
>>> id(x) == id(x)
True
>>> x == x
False

私はnan != nanpythonでどのように興味があります。nan明確にするために、定義上、そのように動作することになっていることを知っています。理由についてではなく、方法について質問しています。それはどこに実装されていますか?そのように動作する他のオブジェクトはありますか?

4

3 に答える 3

5

非数 (NaN) は、何とも等しくありません。それを検出するには、 を使用しますmath.isnan。そして、このようなオブジェクトは非常に簡単に定義できます:

class A(object):
    def __eq__(self, other):
        return False

    def __ne__(self, other):
        return True

この理由は非常に単純です。CPython は、浮動小数点演算の IEEE 754 標準に従います。NaN は浮動小数点値であり、IEEE 754 では他の浮動小数点値と等しくないと規定されています。

于 2012-10-21T23:24:02.960 に答える
3

浮動小数点演算を実装するマシンコードは、NaNを使用した演算の結果を処理します。x86プロセッサシリーズの場合、これは通常x87コプロセッサ命令を使用して実現されますが、x87コプロセッサが常に存在するとは限らない以前のx86プロセッサの場合、コンパイラは通常エミュレーションコードを提供します。

于 2012-10-21T23:29:22.310 に答える
3

質問の「場所」の部分については、Python2.7.3ソースツリーのObjects/floatobject.cの391行目から見てください。NaN == NaNの動作について簡単に説明し、次の実装を行います。

同様の動作を示す他のケースに関しては、それは確かに可能です。ただし、ライブラリを徹底的に検索したわけではないので、明確な答えを出すことはできません。

于 2012-10-21T23:38:48.623 に答える