1. ホーム
  2. math

[解決済み] 初心者の言葉で「NaN(Not a Number)」とは何か?[クローズド]

2022-03-07 19:55:48

質問内容

NaNやNumber which isn't a real Numberが何なのか、まだ理解していません。

主な質問です。

  1. NaN値、NaNとは具体的にどのようなものですか(非数学系の先生の言葉で)。

さらに私は、NaNが何であるべきかを理解する上で私に不満を与えている、全体の状況についていくつかの質問があります。

  1. 結果がNaNになる操作にはどのようなものがありますか?

  2. 0.0 / 0.0 の結果はなぜ未定義とされているのですか?0であるべきではないでしょうか?

  3. なぜ数学の演算結果は浮動小数点数か整数で表現できないのでしょうか?ある値が表現できないのはどうしてでしょうか?

  4. 負の数の平方根はなぜ実数でないのか?

  5. なぜNaNは不定形と同等ではないのですか?

このStack Overflowを含め、インターネット上ではNaNとは何かということを理解できる説明がありませんでした。


とにかく私は、私の質問に対する理解しやすい答えを見つけるために、すでにスキャンした場所へのリンクとして私の研究を提供したい。たとえいくつかのリンクが他のプログラミング言語で同じ質問に行くとしても、全体として私に望ましい明確な情報を与えなかった。

ウィキペディア

https://en.wikipedia.org/wiki/NaN

https://en.wikipedia.org/wiki/IEEE_754

その他

http://foldoc.org/Not-a-Number

https://www.youtube.com/watch?v=HN_UmxIVS6M

https://www.youtube.com/watch?v=9EsHjXftO7s

スタックオーバーフロー

他の言語に対する類似または同じ質問(同じでなくても、理解のベースが非常に似ていると思う限り提供します)。

Javaで、NaNとはどういう意味ですか?

IEEE754のNaN値に対して、すべての比較がfalseを返す根拠は何ですか?

(文字列が有効な数値であるかどうかをチェックするJavaScriptの(組み込みの)方法

JavaScript:NaN、オブジェクト、プリミティブって何?

数字ではない(NaN)

C++に関する質問です。

quiet NaNとsignaling NaNの違いは何ですか?

C++でdouble(またはfloat)がNaNかどうか確認する

インテル® C++ コンパイラーで NaN - NaN == 0.0 となるのはなぜですか?

IND数とNAN数の違いは何ですか


いつも参考になる回答やコメントをありがとうございます。

どのように解決するのですか?

あなたはここで一連の素晴らしい質問をしました。ここでは、その一つひとつに対応していこうと思います。

<ブロッククオート

NaN値、NaNとは一体何なのか(非数学部の教授の言葉)?

1, π, e, -137, 6.626 などの実数を扱うとしましょう。実数の世界では、次のような演算があります。 通常 は実行できますが、結果が定義されていないこともあります。例えば、対数について見てみましょう。例えば、ln e = 1、ln 10は約2.3というように、たくさんの実数の対数を取ることができます。しかし、数学的には、負の数の対数は定義されていない。つまり、ln (-4) をとって実数に戻すことはできない。

さて、ここでプログラミングの世界に飛び込んでみましょう。ある数の対数を計算するプログラムを書いていて、どういうわけかユーザが負の数の対数で割って欲しいと思っているとします。どうなるでしょうか?

この質問に対しては、合理的な答えがたくさんあります。Pythonのようないくつかの言語で行われているように、操作で例外をスローさせることができます。

しかし、ハードウェアのレベルでは、(IEEE-754規格を設計した人々によって)プログラマに第2の選択肢を与えることが決定されたのです。プログラムをクラッシュさせるのではなく、操作によって「あなたは私に何か不可能なことをさせたかったので、エラーを報告します」という意味の値を生成させることができるのです。 NaN ("Not a Number")で、計算のどこかで数学的に定義されていない操作を行おうとしたことを示します。

この方法にはいくつかの利点があります。多くの科学計算環境では、コードは一連の長い計算を実行し、定期的に興味のある中間結果を生成します。定義されていない演算が NaN その結果、プログラマーは自分の思い通りに計算を行うだけのコードを書き、そのコードの中に特定の箇所を導入して、その操作が成功したかどうかをテストすることができるのです。そこから、何をすべきかを決めることができる。例外を発生させたり、プログラムをクラッシュさせたりすると、プログラマーは失敗する可能性のある一連の浮動小数点演算をすべて保護する必要があるか、自分で手作業でテストしなければならないことになる。どちらの方が良いか判断する必要があるため、浮動小数点NaNの動作を有効または無効にすることができるのです。

<ブロッククオート

結果としてNaNが発生する操作とは?

を取得する方法はたくさんあります。 NaN の結果です。ここでは、その一部を紹介します。ただし、これは完全なリストではありません。

  1. 負の数の対数をとること。
  2. 負の数の平方根をとる。
  3. 無限大から無限大を引くこと。
  4. に対して任意の算術演算を行う。 NaN .

ただし、以下のような操作では NaN 数学的に未定義であってもです。例えば、正の数を0で割ると、数学的に定義されていないにもかかわらず、結果として正の無限大が得られます。これは、正のxについて、yが正の方向から0に近づくときのx / yの極限をとると、その値は際限なく大きくなっていくからである。

<ブロッククオート

0.0 / 0.0の結果が未定義と宣言されているのはなぜですか?それは0であるべきではないですか?

これは何よりも数学的な質問です。これは、限界がどのように機能するかに関係しています。0 / 0 をどのように定義するか考えてみましょう。一つの選択肢として、次のように言うことができます。「0 / x という式を見て、x が 0 に近づくと限界になる」とすると、各点で 0 が見えるので、限界は 0 になるはずです。一方、式 x / x を見て、x が 0 に近づいたときの極限を求めると、各点で 1 が見えるので、極限は 1 であるべきである。これは問題です。0 / 0 の値は、これらの式のいずれかを評価したときに得られるものと一致させたいのですが、意味のある固定値を選ぶことはできません。その結果、0 / 0の値は次のように評価されます。 NaN これは、ここに割り当てるべき明確な値がないことを示しています。

なぜ数学の演算結果は浮動小数点数か整数で表現できないのか?どうして値が表現できないのでしょうか?

これは、IEEE-754浮動小数点数の内部構造に関係している。直感的には、これは次のような単純な事実に帰結します。

  1. 無限に多くの実数があり、そのうちの無限に長い非繰り返し小数を持つ実数は無限にありますが
  2. コンピュータのメモリは有限である。

その結果、任意の実数を格納するためには、無限に長い数字の羅列を格納することになりかねず、有限メモリのコンピュータではそれができないのです。そこで、浮動小数点数には 近似値 実数の とてつもなく巨大でないもの また、値を表現できないのは、近似値を保存しているに過ぎないからです。

実際にどのように数値が格納されているのか、これが実際に何を意味するのかについては、伝説のガイドをご覧ください。 浮動小数点演算についてプログラマが知っておくべきこと"

<ブロッククオート

負の数の平方根はなぜ実数でないのか?

例えば、√(-1)を例に挙げてみましょう。これが実数x、つまりx=√(-1)であると想像してください。平方根の考え方は、それ自体を掛けると平方根を取った数が戻ってくるというものです。

では...xは何番でしょう?x≠0であることは、0だからわかる。 2 = 0は-1ではない。また、正の数の倍数は正の数なので、xは正になり得ないことも知っている。そして、私たちは また は負になりえないことがわかる。なぜなら、負の数の倍数は正になるからだ。

ここで問題が発生しました。このxが何であれ、正でもなく、ゼロでもなく、負でもないことが必要です。つまり、実数ではないのだ。

実数を複素数に一般化するには、i という数を導入します。 2 = -1. 実数にはこのようなものはないことに注意してください。

<ブロッククオート

なぜNaNは不定形と等価ではないのですか?

例えば、0 / 0は不定と言われるかもしれません。0 / 0にどうアプローチするかによって、0が返ってくるか、1が返ってくるか、あるいは他の何かが返ってくるかもしれないからです。一方、√(-1)は複素数として完全に定義されています(√(-1)が-iではなくiを返すと仮定して)。したがって、問題は「不定である」ではなく、「値はあるが、その値は実数でない」なのです。

お役に立てれば幸いです。