198

単なる好奇心から。

数字というのはあまり論理的ではないようですtypeof NaN。ちなみに、falseと同じNaN === NaNNaN == NaN、falseを返します。これはjavascriptの特徴の1つですか、それともこれには理由がありますか?

編集:あなたの答えに感謝します。しかし、頭を動かすのは簡単なことではありません。答えとウィキを読んで私はもっと理解しましたが、それでも、

NaNとの比較では、それ自体と比較した場合でも、常に順序付けられていない結果が返されます。比較述語はシグナリングまたは非シグナリングのいずれかであり、シグナリングバージョンはそのような比較の無効な例外を通知します。等式および不等式の述語はシグナリングではないため、falseを返すx = xを使用して、xが静かなNaNであるかどうかをテストできます。

頭を回転させ続けるだけです。誰かがこれを(たとえば数学者ではなく)人間が読める言語に翻訳できれば、私は感謝するでしょう。

4

21 に答える 21

120

さて、「数ではない」と呼ばれるものが数と見なされるのは少し奇妙に思えるかもしれませんが、その事実にもかかわらず、NaNそれでも数値です:-)

NaN数値タイプの制限内で特定の値を表すことができないことを意味します(ただし、これは、丸める必要のあるすべての数値に当てはまる可能性がありますNaNが、特殊なケースです)。

それらは異なる値である可能性があるため、特定のものNaNは別のものと等しいとは見なされません。NaNただし、NaN2718や31415と同様に、まだ数値タイプです。


素人の言葉で説明するためのあなたの更新された質問に関して:

NaNとの比較では、それ自体と比較した場合でも、常に順序付けられていない結果が返されます。比較述語はシグナリングまたは非シグナリングのいずれかであり、シグナリングバージョンはそのような比較の無効な例外を通知します。等式および不等式の述語は非シグナリングであるため、falseを返すx = xを使用して、xが静かなNaNであるかどうかをテストできます。

このすべての手段は(部分に分解されて):

NaNとの比較では、それ自体と比較した場合でも、常に順序付けられていない結果が返されます。

基本的に、aは、別の、さらにはそれ自体NaNを含む他の数と等しくありません。NaN

比較述語はシグナリングまたは非シグナリングのいずれかであり、シグナリングバージョンはそのような比較の無効な例外を通知します。

aと別の数値の間で比較(より小さい、より大きいなど)操作を行おうとするとNaN、例外がスローされる(シグナリング)か、結果としてfalseになる(シグナリングしない、または静かになる)可能性があります。

等式および不等式の述語は非シグナリングであるため、falseを返すx = xを使用して、xが静かなNaNであるかどうかをテストできます。

同等性(等しい、等しくない)のテストはシグナルを送信しないため、それらを使用しても例外は発生しません。あなたが通常の番号を持っているならx、それからx == x常に真になります。xがの場合NaNx == xは常にfalseになります。NaNそれはあなたに簡単に(静かに)検出する方法を与えています。

于 2010-05-10T09:33:47.373 に答える
64

それは数字ではないことを意味します。これはjavascriptの特性ではなく、一般的なコンピュータサイエンスの原則です。

http://en.wikipedia.org/wiki/NaNから:

NaNを返す操作には次の3種類があります。

少なくとも1つのオペランドとしてNaNを使用する演算

不定形

  • 除算0/0、∞/∞、∞/-∞、-∞/∞、および-∞/-∞
  • 乗算0×∞および0×−∞
  • パワー1^∞
  • 加算∞+(-∞)、(-∞)+∞および同等の減算。

複雑な結果を伴う実際の操作:

  • 負の数の平方根
  • 負の数の対数
  • 90度(またはπ/ 2ラジアン)の奇数倍の接線
  • -1未満または+1より大きい数値の逆正弦または余弦。

これらの値はすべて同じではない場合があります。NaNの簡単なテストは、value == valuefalseをテストすることです。

于 2010-05-10T09:35:43.503 に答える
22

ECMAScript(JavaScript)標準では、 IEEE 754フロートNumbersが指定されており、可能な値として含まれています。NaN

ECMA 262 5eセクション4.3.19:数値

倍精度64ビットバイナリ形式のIEEE754値に対応するプリミティブ値。

ECMA 262 5eセクション4.3.23:NaN

IEEE754の「Not-a-Number」値である数値。

ウィキペディアのIEEE754

IEEE Standard for Floating-Point Arithmeticは、米国電気電子学会によって確立された技術標準であり、浮動小数点計算で最も広く使用されている標準です[...]

標準は定義します

  • 算術形式:有限数(符号付きゼロと非正規数を含む)、無限大、および特別な「非数」値(NaN)で構成される2進および10進浮動小数点データのセット

[...]

于 2011-07-13T12:13:17.187 に答える
9

typeof NaN次の理由で返されます'number'

  • ECMAScriptの仕様によると、NumberタイプにはNaNが含まれています。

    4.3.20番号タイプ

    特別な「Not-a-Number」(NaN)値、正の無限大、および負の無限大を含む、すべての可能な数値のセット

  • したがって、typeofそれに応じて戻ります。

    11.4.3演算子のタイプ

    プロダクションUnaryExpressiontypeof UnaryExpressionは次のように評価されます。

    1. UnaryExpressionを評価した結果をvalとします
    2. Typeval)がReferenceの場合、
      1. IsUnresolvableReference (val)がtrueの場合を返します。"undefined"
      2. valをGetValue (val)とします。
    3. 表20 に従って Typeval )によって決定された文字列を返します。

                    Table 20 — typeof Operator Results
    ==================================================================
    |        Type of val         |              Result               |
    ==================================================================
    | Undefined                  | "undefined"                       |
    |----------------------------------------------------------------|
    | Null                       | "object"                          |
    |----------------------------------------------------------------|
    | Boolean                    | "boolean"                         |
    |----------------------------------------------------------------|
    | Number                     | "number"                          |
    |----------------------------------------------------------------|
    | String                     | "string"                          |
    |----------------------------------------------------------------|
    | Object (native and does    | "object"                          |
    | not implement [[Call]])    |                                   |
    |----------------------------------------------------------------|
    | Object (native or host and | "function"                        |
    | does implement [[Call]])   |                                   |
    |----------------------------------------------------------------|
    | Object (host and does not  | Implementation-defined except may |
    | implement [[Call]])        | not be "undefined", "boolean",    |
    |                            | "number", or "string".            |
    ------------------------------------------------------------------
    

この動作は、浮動小数点演算に関するIEEE標準(IEEE 754)に準拠しています。

4.3.19数値

倍精度64ビットバイナリ形式のIEEE754値に対応するプリミティブ値

4.3.23 NaN

IEEE754の「Not-a-Number」値である数値

8.5番号タイプ

Numberタイプには、正確に18437736874454810627(つまり、2 53 -2 64 +3)の値があり、9007199254740990(9007199254740990(9007199254740990)を除いて、IEEE Standard for BinaryFloating-PointArithmeticで指定されている倍精度64ビット形式のIEEE754値を表します。つまり、2 53 -2)IEEE標準の個別の「Not-a-Number」値は、ECMAScriptでは単一の特別なNaN値として表されます。( NaN値はプログラム式によって生成されることに注意してくださいNaN。)

于 2015-01-10T20:59:32.943 に答える
6

NaN != NaNそれらは同じ非番号である必要はないからです。したがって、それは非常に理にかなっています...また、フロートの+0.00と-0.00の両方が同じではない理由もあります。丸めによって、実際にはゼロではない場合があります。

typeofに関しては、それは言語に依存します。そして、ほとんどの言語は、NaNがどのように分類されるかに応じて、float、double、またはnumberであると言います...これが不明なタイプまたはnullであると言う言語はありません。

于 2010-05-10T09:33:43.240 に答える
5

NaNは有効な浮動小数点値です(http://en.wikipedia.org/wiki/NaN

およびNaN===NaNは、必ずしも同じ非数値ではないため、falseです。

于 2010-05-10T09:35:48.523 に答える
4

NaNNotaNumberの略です。これは、ゼロ除算などの無効な演算の結果を表す数値データ型(通常は浮動小数点型ですが、常にではありません)の値です。

その名前はそれが数字ではないことを示していますが、それを保持するために使用されるデータ型は数値型です。したがって、JavaScriptでは、のデータ型を要求するNaNと返さnumberれます(alert(typeof(NaN))明確に示されているように)。

于 2011-07-13T12:12:28.330 に答える
2

Javascriptは、NaNを使用して、仕様では他の方法では表現できない、遭遇したものを表現します。数字ではないという意味ではありません。これは、出会いを説明する最も簡単な方法です。NaNは、それまたはそれを参照するオブジェクトをjavascriptで他の方法で表すことができなかったことを意味します。すべての実用的な目的のために、それは「不明」です。「不明」であるため、それが何であるか、またはそれ自体であるとしても、それを伝えることはできません。割り当てられているオブジェクトでもありません。それはそれが何でないかをあなたに伝えることができるだけであり、not-nessまたはnothingnessはプログラミング言語で数学的にしか記述できません。数学は数に関するものなので、javascriptはNaNとして無を表します。それは数字ではないという意味ではありません。それは、私たちがそれを意味のある他の方法で読むことができないことを意味します。それができる理由です」tはそれ自体にさえ等しい。そうではないからです。

于 2011-12-22T09:21:47.303 に答える
2

のより適切な名前はNaN、その意味をより正確に、混乱を少なく説明するために、数値の例外になります。これは、(言語設計によって)プリミティブ型を装った別の種類の例外オブジェクトであり、同時に、誤った自己比較ではプリミティブとして扱われません。どこから混乱。そして、言語が適切な例外オブジェクトプリミティブな数字のどちらかを選択することを「気にしない」限り、混乱は続きます。

NaNそれ自体の悪名高い不平等は、両方==とも、===この例外オブジェクトをプリミティブ型に強制する混乱した設計の現れです。これは、プリミティブがその値によって一意に決定されるという基本原則を破ります。例外と見なされることが望ましい場合NaN(さまざまな種類が存在する可能性があります)、プリミティブとして「販売」されるべきではありません。そして、それが原始的であることが望まれるならば、その原則は成り立たなければなりません。JavaScriptの場合のように、それが壊れている限り、そして2つを実際に決定することはできませんが、関係するすべての人に不必要な認知的負荷をもたらす混乱は残ります。ただし、これは2つの中から選択するだけで簡単に修正できます。

  • NaN現在実装されているものとしてその情報を破棄するのではなく、例外がどのように発生したかに関する有用な情報を含む特別な例外オブジェクトを作成し、デバッグが困難なコードを作成します。
  • またはNaN、プリミティブ型のエンティティnumber(「数値」と簡単に呼ばれる可能性があります)を作成します。この場合、それはそれ自体と等しくなければならず、他の情報を含めることはできません。後者は明らかに劣った選択です。

タイプに強制NaNすることの唯一の考えられる利点は、numberそれを任意の数式に戻すことができることです。ただし、を含む数式の結果は、に評価される、つまり例外を保持する代わりに戻るなどの予測できない結果につながるため、これは脆弱な選択にNaNなります。NaNNaN < 0falseboolean

また、「物事は現状のまま」であっても、コードをより予測可能でデバッグしやすくするために、明確に区別することを妨げるものは何もありません。実際には、それはそれらの例外を識別し、それらを例外として処理することを意味します。残念ながら、これはより多くのコードを意味しますが、FlowtypeのTypeScriptなどのツールによって軽減されることを願っています。

そして、乱雑な静かな対騒々しい別名シグナリングNaNの区別があります。これは実際には、例外自体ではなく、例外の処理方法に関するものであり、他の例外と何ら変わりはありません。

同様に、Infinityとは実数直線の延長で生じる数値型+Infinityの要素ですが、実数ではありません。数学的には、またはのいずれかに収束する実数のシーケンスで表すことができます。+-Infinity

于 2016-05-17T03:37:19.650 に答える
1

NANを考える最良の方法は、その数が不明であるということです。そのため、各NAN値は一意の不明な数値を表すため、NAN!=NANです。浮動小数点数の値の範囲は限られているため、NANが必要です。場合によっては、下位ビットが失われると丸めが発生し、1.0 / 11 * 11!=1.0のように意味がないように見えます。大きい値が本当に大きいのはNANであり、無限大が完璧な例です。

指が10本しかない場合、10を超える値を表示しようとすることは不可能です。つまり、この10を超える値の真の値を失ったため、このような値はNANである必要があります。同じことが浮動小数点値にも当てはまります。この場合、値は浮動小数点数で保持できる値の制限を超えます。

于 2010-05-10T12:25:09.653 に答える
1

これはNaN、がJSのNumberオブジェクトのプロパティであるためです。これは、数値であることとは関係ありません。

于 2010-05-10T09:35:09.350 に答える
1

NaNはまだ数値タイプですが、有効な数値を表すことができなかった値を表します。

于 2011-07-13T12:12:34.310 に答える
1

NaNは数値データ型だからです。

于 2011-07-13T12:12:54.553 に答える
1

NaNはタイプの観点からは数値ですが、1、2、329131のような正規数ではありません。「数値ではない」という名前は、表される値が特殊であり、IEEE形式の仕様ドメインに関するものであるという事実を示しています。 javascript言語ドメイン。

于 2011-07-13T12:13:29.967 に答える
1

jQueryを使用している場合isNumericは、タイプをチェックするよりも優先します。

console.log($.isNumeric(NaN));  // returns false
console.log($.type(NaN));       // returns number

http://api.jquery.com/jQuery.isNumeric/

于 2013-07-19T18:53:03.407 に答える
0

Javascriptには、標準の64ビット倍精度浮動小数点数である数値データ型が1つだけあります。すべてがダブルです。NaNはdoubleの特別な値ですが、それでもdoubleです。

文字列をparseInt数値データ型に「キャスト」するだけなので、結果は常に「数値」になります。元の文字列が解析可能でなかった場合にのみ、その値はNaNになります。

于 2011-07-13T12:12:11.013 に答える
0

NaNは特殊なケースのオブジェクトであると言えます。この場合、NaNのオブジェクトは、数学的に意味のない数値を表します。INFINITEなど、数学には他にもいくつかの特殊なケースのオブジェクトがあります。

それでもいくつかの計算を行うことができますが、それは奇妙な振る舞いをもたらします。

詳細はこちら: http: //www.concentric.net/~ttwang/tech/javafloat.htm(javascriptではなくjavaベース)

于 2011-07-13T12:16:01.430 に答える
0

あなたはJavascriptを愛さなければなりません。それはいくつかの興味深い小さな癖があります。

http://wtfjs.com/page/13

それらの癖のほとんどは、論理的に解決するのをやめた場合、または数論について少し知っている場合に説明できますが、それでも、それらについて知らない場合でも、それらはあなたを捕まえることができます。

ちなみに、http: //wtfjs.com/の残りの部分を読むことをお勧めします-これよりもはるかに興味深い癖が見つかります!

于 2011-07-13T12:16:13.163 に答える
0

値NaNは実際にはNumber.NaNであるため、数値かどうかを尋ねると、「はい」と表示されます。isNaN()呼び出しを使用して、正しいことを行いました。

参考までに、NaNは、ゼロによる除算や負の数の平方根のように定義されていない数の演算によっても返される場合があります。

于 2011-07-13T12:19:22.620 に答える
-2

POSITIVE_INFINITYとしての数値タイプの特殊値です

なんで?意図的に

于 2011-07-13T12:12:20.030 に答える
-2

文字列を数値に変換していると想像してみてください。

Number("string"); // returns NaN

データ型を数値に変更しましたが、その値は数値ではありません!

于 2019-04-10T14:24:44.010 に答える