JSON 객체는 NaN과 Infinity값을 담을 수 없다고 한다. 이 과정에서 NaN과 Infinity값이 어떤 특징을 갖고 있기에 JSON 객체에 담고 있는지 궁금해져서 NaN과 Infinity에 대한 간략한 정보를 찾아보았다.
IEEE 754는 실수 표현을 위한 부동소수점 표준을 정의한다. 실수 표현 뿐만 아니라 Infinity, NaN을 정의한다.
무한대를 표함하는 산술 표현은 표현 가능한 숫자의 범위를 벗어난 값으로 정의된 무한값을 사용한다. 산술의 제한 케이스로 사용된다.
−∞ < representable numbers < +∞
NaN은 부동소수점 형식으로 인코딩된 기호화 항목이다. Not a Number를 가리키며 숫자가 아니라는 뜻이다. NaN은 다음과 같은 두가지 유형이 있다.
잘못된 연산의 예외의 신호를 알리는 NaN이다.
예외의 신호없이 거의 모든 산술 연산을 통해 전파되는 NaN이다.
NaN은 다음과 같은 연산을 통해 만들어진다.
∞ − ∞, −∞ + ∞, 0 × ∞, 0 ÷ 0, ∞ ÷ ∞
두가지 형태의 NaN과 Infinity는 부동소수점 형식에 의해 표현되는데 그 형식(Single / Double Precision)에 따라 값이 달라진다.
그렇다면 JavaScript에서 Infinity와 NaN값을 다르는 방법에 대해 알아보자
Infinity는 전역 스코프의 변수이며 초기값은 Number.POSITIVE_INFINITY
이다. NaN과 마찬가지로 [[Writable]]
, [[Enumerate]]
, [[Configurable]]
의 설정값이 false이다.
어떤 숫자가 Infinity인지 확인하기 위해 isFinite()
을 사용하는 것이 간편하다.
자바스크립트에서 NaN은 전역 스코프의 변수이며 값의 설정과 쓰기가 불가능하다.
초기값은 Number.NaN과 같다. 하지만 NaN은 다른 모든 값과 비교할 때 같지 않다. 위에서 알아본 NaN의 부동소수점값을 보면 알 수 있다. 또한 NaN은 다른 NaN의 값과도 다르다.
NaN의 판별은 Number.isNaN()
이나 isNaN()
을 사용하는것이 간편하다. 또한 NaN만이 자기 자신과 다르다는 성질을 이용할 수도 있다.