Pythonのフロートのコールド知識

今週はPyCoder's Weekly、それは非常に興味深いです冷たい知識と呼ば小さな記事を、共有している、私は皆のために共有するいくつかの単語を追加します。

問題の一部は、読者が最初に考えること、それを述べました。

  • 両方のタプルが等しい、すなわち、A == B及びAがBである場合には、同一の要素のインデックス(例えば、[0]、B [0])が必ずしも等しくは?
  • 二つのオブジェクトのハッシュ結果が等しい場合、そのハッシュの(a)==ハッシュ(b)は、その後、彼らはそれが避けられないかどうか等しいですか?

もちろん、答えはノーです(か冷たい知識と呼ばれる)、我々が最初にそれを答えることをしようとし、その後見下ろすことができます。

----- -----分割ラインを考えます

さて、最初の質問を見てみましょう。二つの同じタプル、B、彼らは次のような関係を持っています:

>>> a = (float('nan'),)
>>> b = a
>>> a   # (nan,)
>>> b   # (nan,)

>>> type(a), type(b)
(<type 'tuple'>, <type 'tuple'>)

>>> a == b
True

>>> a is b  # 即 id(a) == id(b)
True

>>> a[0] == b[0]
False

(タイプ、値及びIDが同じである)、AがBに等しいが、その敷地内の要素は等しくない:上記のコードがあることを示しています。

二つの元グループの唯一の要素(単一要素のタプルのための方法であり、他の要素カンマ、すなわちLEN(A)== 1)。フロートは、()のパラメータは、浮動小数点数として構成することができる、組み込み関数です。

なぜこれがそうですか?どのような書類をまず確認し、組み込み関数解析規則は以下のとおりです。

sign           ::=  "+" | "-"
infinity       ::=  "Infinity" | "inf"
nan            ::=  "nan"
numeric_value  ::=  floatnumber | infinity | nan
numeric_string ::=  [sign] numeric_value

「インフィニティ」または「INF:それを解析すると、スペースが前とプレフィックスマイナス記号(+/-)、浮動小数点は、加えて、2つの文字列を解決することができます(大文字と小文字を区別しない)の後に、解決することができます「無限の数を示す;」ナン」は、(非数)の数を表していない、具体的には、数字以外のすべてのものを指します。

最初寒冷前線は、全体として、2つのタプルは同じであるが、それらは、同一の要素だけではなく、単に「ナン」は関連する知識を共有します。これがそうである理由は、ので、「ナン」は離れて数以外のものから、それは範囲だと言ったので、私たちは比較することはできません。

比較として、の結果であり、どのような二つの「無限のフロート」を見てみましょう:

>>> a = (float('inf'),)
>>> b = a
>>> a   # (inf,)
>>> b   # (inf,)

>>> a == b  # True
>>> a is b  # True
>>> a[0] == b[0]  # True

我々は結論することができるように、前の2つのタプルと比較する最後の時間はちょうど反対であることに注意してください:2つの無限の浮動小数点値が等しい、と二つの「もののない数は、」値が等しくありません。

ビットの簡素化、それは読まなければなりません。

>>> a = float('inf')
>>> b = float('inf')
>>> c = float('nan')
>>> d = float('nan')

>>> a == b  # True
>>> c == d  # False

これらは、最初の寒さの秘密の知識です。そして、第二の外観:

>>> hash(float('nan')) == hash(float('nan'))
True

2つのフロントはちょうど「ものの数ではない」と等しくありませんが、ここで彼らは常識とは全く反対に等しいハッシュ結果を示し、と述べました。

私たちは、単純な結論を推論することができます:2つのオブジェクトは等しくないが、ハッシュ結果は同じであってもよいです。

その理由は、ハッシュ(フロート(「ナン」))の結果が0であるということである、それは同等の時間経過を比較するための固定値です。

実際には、ハッシュ上の()関数ではなく、埋葬卵:

>>> hash(float('inf'))  # 314159
>>> hash(float('-inf')) # -314159

あなたは、この数はああ非常に精通していると思いますか?これは、小数点以下トップ5 3.14159除去結果の円周の比率です。以前のバージョンのPython、マイナスハッシュ結果の無数に実際-271 828、それは自然対数eから取られています。これらの2つの数字が、Pythonインタプリタに敬礼それのようなものをハードコーディングされています。

通常、彼らは辞書のように異なる鍵ではないことが、実際には驚きだった等しいフロート(「ナン」)のハッシュ値、導入されたバージョン:

>>> a = {float('nan'): 1, float('nan'): 2}
>>> a
{nan: 1, nan: 2}

# 作为对比:
>>> b = {float('inf'): 1, float('inf'): 2}
>>> b
{inf: 2}

上述したように、二つの同一のキーのNaNインジケータに(注意、これらは引用符で囲まれていない)、それらは唯一のINFにマージすることができ、共存することができ、ナン魔法を再び実証しました。

さて、2つの冷少し知識の共有が完了すると、すべての背後にある理由はフロート()浮動小数点数を取って、Pythonはこれらの奇妙な結果として、不正確なの存在を示すNaN(非数)が存在するが、可能に結果。

最後に、我々は次の要約を行います。

  • タプルは、2台のフロート(「ナン」)の、全体として比較した場合、結果は同じである含み、二つの等しい組を、それがビット要素に等しくなくてもよいです
  • フロート(「ナン」)は、物事、それ自体決意値「のない数」を示し、2つのオブジェクトが比較のために同じではなく、ハッシュ結果は、比較のために等しい一定値である。辞書のキーとして使用します値が、キーが競合しません
  • フロート(「INF」)は浮動小数点無限大を表し、それは、決定された値として考えハッシュ結果に等しい二つの等しいオブジェクトを比較することができ、キー辞書として使用されるが、競合します
  • ハッシュ結果フロート(「ナン」)ハッシュ結果は、フロート(「INF」)は314159であり、0であります

参考文献:

https://docs.python.org/3/library/functions.html#float

https://www.pythondoeswhat.com/2019/09/welcome-to-float-zone.html

公開番号[ Pythonの猫 ]、記事の質の高いシリーズのシリアル番号は、そこに哲学的な猫のニャースターシリーズ、Pythonのアドバンスシリーズ、推奨叢書、テクニカルライティングであり、高品質の英語翻訳など、歓迎注目ああをお勧めします。

おすすめ

転載: www.cnblogs.com/pythonista/p/11565135.html