programing

NaN 유형이 '번호'를 반환하는 이유는 무엇입니까?

goodsources 2022. 9. 5. 23:23
반응형

NaN 유형이 '번호'를 반환하는 이유는 무엇입니까?

그냥 궁금해서.

하는 것은 그다지 논리적으로 보이지 않는다typeof NaN숫자입니다.같은NaN === NaN또는NaN == NaN그건 그렇고, 거짓으로 돌려보냈죠.이것이 JavaScript의 특징 중 하나입니까?아니면 이유가 있을까요?

편집: 답변 감사합니다.하지만 사람들을 이해시키는 것은 쉬운 일이 아니다.답을 읽고 위키에 대해 더 잘 이해했지만, 여전히, 다음과 같은 문장이 있습니다.

와의 비교NaN는 자신과 비교해도 항상 순서가 매겨지지 않은 결과를 반환합니다.비교 술어는 시그널링 또는 비시그널링입니다시그널링 버전은 이러한 비교에 대해 무효인 예외를 나타냅니다.평등 술어와 불평등 술어는 부호화되어 있지 않기 때문에x = xfalse 반환을 사용하여 x가 무음인지 여부를 테스트할 수 있습니다.NaN.

머리가 빙빙 도는 것 같아요누군가 이것을 (예를 들어 수학자가 아니라) 사람이 읽을 수 있는 언어로 번역해 준다면 고맙겠습니다.

음, "숫자가 아니다"라고 불리는 것이 숫자로 여겨지는 것이 조금 이상하게 보일 수도 있지만,NaN숫자 타입이지만, 다음과 같습니다.- )

NaN단지, 특정의 값을 수치 타입의 제한내에서 나타낼 수 없는 것을 의미합니다(단, 반올림 할 필요가 있는 모든 숫자에 대해서 말할 수 있습니다만).NaN특수한 경우입니다).

특정NaN다른 것과 동등하다고 생각되지 않는다.NaN서로 다른 가치일 수 있기 때문입니다.하지만,NaN2718이나 31415와 마찬가지로 숫자 유형입니다.


최신 질문에 대해 평신도의 용어로 설명하겠습니다.

NaN과의 비교에서는 자신과 비교해도 항상 순서가 없는 결과가 반환됩니다.비교 술어는 시그널링 또는 비시그널링 중 하나이며, 시그널링 버전은 이러한 비교에 대한 무효 예외를 나타냅니다.등식 및 부등식 술어는 비신호이므로 x = x 반환 false를 사용하여 x가 조용한 NaN인지 여부를 테스트할 수 있습니다.

이 모든 것은 (부분으로 나누어져) 다음과 같습니다.

NaN과의 비교에서는 자신과 비교해도 항상 순서가 없는 결과가 반환됩니다.

기본적으로는NaN다른 숫자를 포함한 다른 숫자와 동일하지 않습니다.NaN그 자체도 포함해서요.

비교 술어는 시그널링 또는 비시그널링 중 하나이며, 시그널링 버전은 이러한 비교에 대한 무효 예외를 나타냅니다.

비교(보다 작음, 보다 큰 등) 조작을 시도하고 있다.NaN또 다른 번호에서는 예외가 느려지거나(시그널링), 그 결과 false가 되는(비시그널링 또는 quiet) 경우가 있습니다.

등식 및 부등식 술어는 비신호이므로 x = x 반환 false를 사용하여 x가 조용한 NaN인지 여부를 테스트할 수 있습니다.

동등성 테스트(동일, 동일하지 않음)는 시그널링이 아니기 때문에 예외는 발생하지 않습니다.정규번호가 있으면x,그리고나서x == x언제나 진실일 것이다.한다면x는 입니다.NaN,그리고나서x == x항상 거짓일 것이다.이 장치를 통해 이 모든 걸 탐지할 수 있습니다.NaN쉽게(쉽게)

번호가 아님을 의미합니다.javascript의 특이점이 아니라 일반적인 컴퓨터 과학 원리입니다.

http://en.wikipedia.org/wiki/NaN 에서 :

NaN을 반환하는 동작에는 다음 3종류가 있습니다.

NaN을 적어도1개의 오퍼랜드로 하는 조작

부정 형식

  • 디비전 0/0, '/', '/', '-'/' 및 '-'/'/'/'-'
  • 0× and와 0×-의 곱
  • 전력 1^†
  • 더하기 + + (-),), (-)) + and 및 등가 감산.

복잡한 결과를 가져오는 실제 운영:

  • 음수의 제곱근
  • 음수의 로그
  • 90도(또는 µ/2 라디안)의 홀수 배수의 탄젠트
  • -1보다 작거나 +1보다 큰 숫자의 역사인 또는 코사인입니다.

이러한 모든 값이 동일하지는 않을 수 있습니다.NaN에 대한 간단한 테스트는 다음과 같습니다.value == value거짓입니다.

ECMAScript(JavaScript) 규격은 다음과 같이 규정되어 있습니다.NumbersIEEE 754 플로트입니다.여기에는 다음이 포함됩니다.NaN가능한 값입니다.

ECMA 262 5e 섹션 4.3.19: 번호 값

2배 정밀도의 64비트 바이너리 포맷의 IEEE 754 값에 대응하는 프리미티브 값.

ECMA 262 5e 섹션 4.3.23: NaN

IEEE 754 "Not-a-Number" 값인 번호 값.

IEEE 754 (Wikipedia)

IEEE 부동소수점 산술 표준은 전기전자공학협회에 의해 제정된 기술 표준으로 부동소수점 계산에 가장 널리 사용되는 표준입니다. [...]

이 표준은 다음을 정의한다.

  • 산술 형식: 유한수(부호가 있는 0과 하위 정규수 포함), 무한수 및 특수한 "not a number"(not a number) 값(NaNs)으로 구성된 이진수 및 10진수 부동소수점 데이터 세트

[...]

typeof NaN돌아온다'number'이유:

  • ECMAScript 사양에 따르면 Number type에는 NaN이 포함되어 있습니다.

    4.3.20 번호 유형

    특수 "Not-a-Number"(NaN) 값, 양의 무한대 및 음의 무한대를 포함한 가능한 모든 숫자 값 집합

  • 그렇게typeof는 이에 따라 다음과 같이 반환됩니다.

    11.4.3 운영자의 유형

    프로덕션 Unary Expression:typeof UnaryExpression은 다음과 같이 평가됩니다.

    1. val은 Unary Expression을 평가한 결과입니다.
    2. Type(val)이 Reference인 경우
      1. IsUnresolvableReference(val)가 true이면 반환한다."undefined".
      2. val을 GetValue(val)로 합니다.
    3. 표 20에 따라 유형(val)에 의해 결정된 문자열을 반환합니다.

                    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 번호값

2배 정밀도의 64비트 바이너리 포맷 IEEE 754 값에 대응하는 원시값

4.3.23 NaN

IEEE 754 "Not-a-Number" 값인 번호 값

8.5 번호 타입

그 번호 형식은 배정 밀도 64비트 형식을 나타내는 정확히 18437736874454810627(그, 253−264+3은)가치들을 가지고 있고 IEEE754값에 명시한 것을 IEEE표준에 대한 이진 Floating-Point 산술, 제외하고는 9007199254740990(그, 253−2은) 뚜렷한“Not-a-Number”값은 IEEE표준이 나타내는에 ECMA스크립트로 asingle 특별한 NaN 값.(NaN 값은 프로그램 식에 의해 생성됩니다).NaN.)

NaN != NaN같은 비숫자가 아니기 때문입니다.그러니까 말이 되네...또한 플로트의 +0.00과 -0.00이 모두 같지 않은 이유이기도 합니다.반올림하면 실제로는 0이 아닐 수 있습니다.

종류에 대해서는 언어에 따라 다릅니다.그리고 대부분의 언어들은 NaN이 부동, 이중 또는 숫자라고 말할 것이다. 어떻게 분류하느냐에 따라...알 수 없는 타입 또는 늘이라고 말할 수 있는 언어는 없습니다.

NaN은 유효한 부동 소수점 값입니다(http://en.wikipedia.org/wiki/NaN)

그리고 NaN === NaN은 반드시 같은 숫자가 아니기 때문에 거짓이다.

NaNNot a Number의 약자입니다.이는 숫자 데이터 유형 값(일반적으로 부동 소수점 유형은 아니지만 항상 0으로 나누는 것과 같은 잘못된 작업의 결과를 나타냄)입니다.

그 이름은 숫자가 아니라고 하지만, 그것을 유지하는 데 사용되는 데이터 유형은 숫자 유형입니다.JavaScript에서는 데이터 타입을 요구합니다.NaN돌아온다number(과 같이)alert(typeof(NaN))(명확하게 실증한다.

에 대한 더 나은 이름NaN의미를 더 정확하고 덜 혼란스럽게 설명하는 것은 숫자 예외입니다.이것은 (언어 설계에 의해) 원시적인 유형을 가진 것으로 위장한 또 다른 종류의 예외 객체이며, 동시에 잘못된 자기 비교에서 원시적인 것으로 취급되지 않습니다.그 혼란이 어디서 왔지?그리고 적절한 예외 객체와 원시 숫자하나를 선택하기 위해 "마음을 정하지 않을 것"이라는 언어가 존재하는 한, 혼란은 계속될 것이다.

악명높은 불평등성NaN둘 다==그리고.===는 이 예외 오브젝트를 원시 타입으로 강제하는 혼란스러운 설계의 표현입니다.이것은 원시인이 그 가치에 의해 고유하게 결정된다는 기본 원칙을 깨뜨린다.한다면NaN예외(는이 있다 다른 종류)로 비춰 지게 되면 원시적이라고"판매"지 않아야 한다 선호합니다.만약 그것이 원시적인 하고 싶그리고, 그 원칙 잡고 있어야 한다.우리가 자바 스크립트에 있는 한, 그리고 우리는 정말 두 사람 사이에 결정하지 못했어요, 혼란과 관련된 사람들에게 불필요한 인지 부하에 남을 것이다.어느 하지만 단순히 그 둘 사이의 선택에 의해 고칠: 쉽다.

  • 둘 중 하나를 만드NaN특별한 예외 개체가 어떻게 예외 발생에 대해 유용한 정보가 포함되로 현재 구현된다로 그 정보를 던지는 것과 반대로,harder-to-debug 코드로 이어진다.
  • 또는 실현NaN그 원시적인 유형의 엔티티이다.number(덜 당황하여."숫자"라고 불릴 수 있었습니다), 이 사건에서 자쳈고 다른어떤 정보가 포함될 수 없다;후자는 분명히 열등한 선택 같아야 한다.

강요하는 것의 유일한 상상할 수 있는 잇점이 있다.NaN안으로numbertype은 임의의 수치식으로 되돌릴 수 있습니다.하지만 그 때문에 선택이 불안정해지죠 왜냐면 그 수치식의 결과는NaN둘 중 하나일 것이다NaN또는 다음과 같은 예측 불가능한 결과를 초래합니다.NaN < 0평가 대상false(즉, 반품)boolean예외를 유지하는 대신.

또, 「사물이 있는 그대로」라고 해도, 코드의 예측 가능성과 디버깅을 용이하게 하기 위해서, 스스로 명확하게 구별하는 것을 막을 수 있는 것은 아무것도 없습니다.이는 실무적으로 그러한 예외를 식별하고 예외로 취급하는 것을 의미한다.유감스럽게도 이것은 더 많은 코드를 의미하지만 Flowtype의 TypeScript와 같은 툴에 의해 완화되기를 바랍니다.

그리고 우리는 지저분하고 조용한 것과 시끄러운 것의 구별을 가지고 있습니다.이것은 예외를 처리하는 방법에 관한 것이지 예외 자체가 아닙니다.다른 예외와 다르지 않습니다.

유사하게,Infinity그리고.+Infinity실선의 연장선에서 발생하는 수치형 요소이지만 실수는 아닙니다.수학적으로, 그것들은 다음 중 하나로 수렴되는 실수의 시퀀스로 표현될 수 있다.+또는-Infinity.

Javascript는 NaN을 사용하여 NaN의 사양으로 나타낼 수 없는 것을 나타냅니다.그것이 숫자가 아니라는 뜻은 아니다.그냥 그 만남을 묘사하는 가장 쉬운 방법일 뿐이야.NaN은 javascript에 의해 NaN 또는 NaN을 참조하는 오브젝트를 다른 방법으로 표현할 수 없음을 의미합니다.모든 실질적인 목적을 위해, 그것은 '알 수 없는' 것이다.'알 수 없다'는 것은 그것이 무엇인지, 심지어 그것이 그 자체인지도 말해줄 수 없다.할당된 개체도 아닙니다.그것이 무엇이 아닌지만 알려줄 수 있고, 없음 또는 없음은 프로그래밍 언어로 수학적으로만 설명할 수 있습니다.수학은 숫자에 관한 것이기 때문에 javascript는 NaN으로 아무것도 아닌 것을 나타냅니다.그게 숫자가 아니라는 뜻은 아니에요.그 말은 우리가 이치에 맞는 다른 어떤 방법으로도 읽을 수 없다는 뜻이죠.그래서 자기 자신조차 못 하는 거야그렇지 않기 때문이다.

이것은 단순히 때문이다.NaN는 JS의 Number 객체의 속성이며 숫자가 되는 것과는 관계가 없습니다.

NAN에 대해 생각하는 가장 좋은 방법은 알려진 숫자가 아니라는 것입니다.각 NAN 값이 고유한 미지의 숫자를 나타내기 때문에 NAN!= NAN은 이러한 이유로 발생합니다.NAN은 부동소수점 숫자의 값 범위가 한정되어 있기 때문에 필요합니다.경우에 따라서는 하위 비트가 손실되어 1.0/11*11!= 1.0과 같은 의미 없는 것으로 보이는 반올림이 발생합니다.정말 큰 값은 무한대가 완벽한 예인 NAN입니다.

손가락이 10개밖에 없기 때문에 10개보다 큰 값을 나타내는 것은 불가능하다는 것을 나타냅니다.즉, 이 10개보다 큰 값의 진정한 값을 잃었기 때문에 이러한 값은 NAN이어야 합니다.부동소수점 값도 마찬가지로 값이 부동소수점 내에 유지할 수 있는 값의 한계를 초과합니다.

NaN은 여전히 숫자 유형이지만 유효한 숫자를 나타낼 수 없는 값을 나타냅니다.

NaN은 숫자 데이터 유형이기 때문입니다.

NaN는 타입의 관점에서 보면 수치이지만 1, 2, 또는 329131과 같은 일반 수치가 아닙니다."Not A Number"라는 이름은 표현된 값이 특별하며 javascript 언어 도메인이 아닌 IEEE 형식의 스펙 도메인에 관한 것임을 의미합니다.

jQuery를 사용하는 경우isNumeric유형 확인 오버:

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

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

Javascript에는 표준 64비트 배정밀 플로트인 하나의 숫자 데이터 유형만 있습니다.모든 것이 이중이다.NaN은 2배의 특별한 값이지만 그럼에도 불구하고 2배의 값입니다.

그 모든 것parseIntdoes는 문자열을 수치 데이터 타입에 "캐스팅"하는 것입니다.따라서 결과는 항상 "숫자"가 됩니다.원래 스트링을 해석할 수 없는 경우에만 그 값은 NaN이 됩니다.

우리는 NaN이 특별한 경우 대상이라고 주장할 수 있다.이 경우 NaN의 개체는 수학적으로 의미가 없는 숫자를 나타냅니다.수학에는 인피니트 등 특별한 경우가 있다.

당신은 그것으로 몇 가지 계산을 할 수 있지만, 그렇게 하면 이상한 행동을 하게 될 것입니다.

자세한 내용은 이쪽:http://www.concentric.net/~twang/tech/htmaffeict.htm (javascript가 아닌 라이선스 기반)

Javascript를 좋아하게 될 거야흥미로운 별난 것들이 몇 가지 있어요.

http://wtfjs.com/page/13

이러한 기호의 대부분은 논리적으로 푸는 것을 멈추거나 숫자 이론에 대해 조금 알고 있다면 설명될 수 있지만, 그럼에도 불구하고 여러분이 그것들을 모르더라도 여전히 여러분을 붙잡을 수 있습니다.

덧붙여서, http://wtfjs.com/의 나머지를 읽어 보는 것을 추천합니다.이것보다 훨씬 더 흥미로운 것이 있습니다!

NaN 값은 실제로는 숫자입니다.그래서 NaN은 번호인지 물어보면 yes라고 대답합니다.isNaN() 콜을 사용하여 올바른 작업을 수행했습니다.

참고로 NaN은 음수의 0 또는 제곱근에 의해 나눗셈과 같이 정의되지 않은 숫자에 대한 연산에 의해 반환될 수도 있습니다.

POSITION_INFINITY로서 Number type의 특수값입니다.

왜? 설계상

Imagine 문자열을 숫자로 변환합니다.

Number("string"); // returns NaN

데이터 유형을 숫자로 변경했지만 값이 숫자가 아닙니다!

언급URL : https://stackoverflow.com/questions/2801601/why-does-typeof-nan-return-number

반응형