더북(TheBook)

기본적으로 NaN은 그 어떤 값과도 같지 않다.5 특히 다른 NaN과도 같지 않고, 무한대를 포함한 다른 어떤 값보다 작지도 않고 크지도 않다.

하지만 이 규칙은 컴파일러가 정적으로 관심 대상의 타입이 부동소수점 타입이라는 사실을 알 때만 적용된다.6 더 일반적인, 예를 들어 수를 컬렉션(collection)에 넣는 것과 같은 경우에는 컴파일러가 동등성 연산자를 사용해 박싱한 타입을 처리하는 규칙을 사용한다. JVM에서 이는 원시 타입의 값을 감싼 DoubleFloat 래퍼 타입의 인스턴스를 비교한다는 뜻이다.

val set = sortedSetOf(Double.NaN, Double.NaN,Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY,0.0)
println(set) // [-Infinity, 0.0, Infinity, NaN]

위 코드는 원소 타입의 자연적인 순서(natural ordering)로 정렬된 트리(JVM에서는 기본적으로 TreeSet이다)를 만들고 원소를 출력한다. 출력은 이런 경우에 다음과 같은 사실이 성립한다는 점을 보여준다.

NaN은 자기 자신과 같다. 집합에 NaN이 단 하나만 추가됐기 때문이다.

NaNDouble에서 가장 큰 값으로 취급된다(심지어 양의 무한대보다도 크다).

이후의 다른 장들에서는 동등성과 순서를 더 자세히 살펴볼 것이다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.