NaNはまだあなたを少し驚かせるかもしれません

画像



最初は、これはインタビューで尋ねられるかもしれない別の質問だと思いました。おそらく、頭脳を適切に使用すれば、結果がどうなるかを推測することができます。彼は椅子にもたれかかって、論理をオンにし、推論に頼る何かを思い出すように考え始めました。しかし無駄です!突然、答えが見つからないことが明らかになりました。しかし、なぜ?それを見つけるために何を理解する必要がありますか?数学では?プログラミング言語では?



答えはNaNでなければなりません。しかし、なぜ私はこれについて確信が持てないのですか?ずっと、NaNを含む式はNaNを返すと確信していました。おそらく、NaNをゼロで除算した場合にのみ、この場合、ZeroDivisionError例外がスローされます。100パーセントNaN!



メモ帳のセルに式を入力します。



>>> 1**nan + 1**nan
2.0


確かに?待つ:



>>> arange(5)**nan
array([nan,  1., nan, nan, nan])


つまり、何らかの理由で、NaNの累乗の1は1ですが、ゼロおよびNaNの累乗の他のすべての数値はNaNです。ロジックはどこにありますか?どうしたの?



では、もう一度行きましょう。



>>> 0**nan, 1**nan
(nan, 1.0)


たぶん私はNaNの深い知識に対する実際的な必要性の欠如のためでした、私はただ何かを疑っていませんでしたか?または多分私は知っていたが、忘れましたか?またはさらに悪いことに-私は知らなかったし、忘れましたか?ウィキペディアに



行きます。そこでは、この問題も問題として指定されていますが、なぜすべてがこのように配置されているのかは、まったく説明されていません。しかし、私はそれを学びました:



>>> hypot(inf, nan)
inf


しかし、同時に:



>>> sqrt(inf**2 + nan**2)
nan


ほら、それも少し奇妙です。



さて、ウィキペディアから182ページのC99移動し、最後に、xがNaNに等しい場合でも、pow(x、0)が任意のxに対して1を返す理由を論理的に説明します



>>> power(nan, 0)
1.0


機能の場合 f((バツ累乗しますg((バツと同時にg((バツは0になる傾向があるため、値に関係なく、結果は1になります。f((バツ



画像



そして、結果が関数の数値に依存しない場合場合、NaNの場合でも、1は有効な結果です。NaNのパワーに1我々は1である理由しかし、これはまだ説明していない 別のを探しC99とページ461の上に私たちは何の説明、ということだけで要件を参照しないPOW(1、y)は、すべてのための1を返す必要がありYにも等しいです、 NaN。すべて。 一方、pow(NaN、0)= 1pow(NaN、0)= NaNより好ましい理由を説明することは、NaNを文字通りNot-a-Numberと見なすべきではないことを示唆しています。f((バツ







..。いくつかの計算の結果、このタイプの数値に割り当てられたメモリサイズを超える数値が得られたとします。次に例を示します。



>>> a = pi*10e307
>>> a
inf


その結果、infが得られました。正確にはこの数値はわかりませんが、それでもある種の数値です。次に、何かを計算し、数が多すぎました。

>>> b = e*10e307
>>> b
inf


ab の違いはNaNを返します:



>>> c = a - b
>>> c
nan


cを数値ではないと 数えることができる唯一の理由は、十分に正確な計算を使用していなかったためです。ただし、cでは、 NaNの下にいくつかの意味が隠されています。この意味が何であるかはわかりません。しかし、それはまだ数であり、これは数であるため、pow(1、NaN)= 1という事実に驚くことは何もありません



では、なぜpow(0、NaN)= NaNなのですか?事実、0を任意の累乗にすると、実際にはゼロになります。 1つのケースを除いて-次数が0の場合:



>>> 0**0
1


このため、特定のNaN値を持つpow(0、NaN)にはあいまいさがあります。もちろん、0がNaNの下に隠れることができる確率はほとんどなく、pow(0、NaN)= 0と仮定することができますしかし、それでも、安全にプレイすることをお勧めします。これが何につながるかはわかりません。おそらくそれが、標準が作成されたときの理由でした。



他に何を言うべきかさえわかりません...事前に答えを知っていれば、おそらく羨ましいでしょう。そのような知識が役立つ分野はおそらく興味深いタスクでいっぱいだからです。そして多分その逆。コメントにそれについて書いてください。



PS NaNは浮動小数点数を参照するため、辞書キーにすることができます。



>>> d = {0.1: 'a', nan: 'b'}
>>> d[nan]
'b'


これを実際に使用するのは理にかなっていますか?私はそれが良いとは思わない。



All Articles