2010-01-28 3 views
8

documentation for java.lang.Double.NaN다른 NaN 값은 무엇입니까?

유형 double의 일정 들고 비수 (NaN) 값 말한다. Double.longBitsToDouble(0x7ff8000000000000L)에 의해 반환 된 값과 같습니다.

이것은 다른 것들을 암시하는 것처럼 보입니다. 그렇다면, 어떻게하면 그걸 잡을 수 있고 이걸 이식 할 수 있니?

명확하게하기 위해, 나는

Double.doubleToRawLongBits(x) != Double.doubleToRawLongBits(Double.NaN) 

Double.isNaN(x) 

모두 해당하는 경우 doublex 같은 것을 발견하고 싶습니다.

+0

다른'java.lang의가있다 * NaN' 의미합니까? –

+0

@Dominic : 아니요 - 질문에 대한 설명이 추가되었다고 생각합니다. –

답변

8

doubleToLongBits 대신 doubleToRawLongBits이 필요합니다.

doubleToRawLongBits은 실제 이진 표현을 추출합니다. doubleToLongBits이 아니라면 NaN을 모두 기본값 NaN으로 변환합니다.

double n = Double.longBitsToDouble(0x7ff8000000000000L); // default NaN 
double n2 = Double.longBitsToDouble(0x7ff8000000000100L); // also a NaN, but M != 0 

System.out.printf("%X\n", Double.doubleToLongBits(n)); 
System.out.printf("%X\n", Double.doubleToRawLongBits(n)); 
System.out.printf("%X\n", Double.doubleToLongBits(n2)); 
System.out.printf("%X\n", Double.doubleToRawLongBits(n2)); 

출력 :..

7FF8000000000000 
7FF8000000000000 
7FF8000000000000 
7FF8000000000100 
+0

'doubleToRawLongBits'에 대한 정보를 제공해 주셔서 감사합니다! –

2

IEEE 754는 모든 지수 비트가 1이고 가수가 0이 아닌 숫자로 NaN을 정의합니다. 과 같이

S  E   M 
x 11111111 xxxxxx....xxx (with M != 0) 

자바 핸들이 :

그래서 단 정밀도 번호를 당신이 찾고있는

Double n = Double.longBitsToDouble(0x7ff8000000000000L); // default NaN 
Double n2 = Double.longBitsToDouble(0x7ff8000000000100L); // also a NaN, but M != 0 

System.out.println(n.isNaN()); // true 
System.out.println(n2.isNaN()); // true 
System.out.println(n2 != Double.doubleToLongBits(Double.NaN)); // true 

가 요약하자면, 당신은 준수 원하는 NaN를 사용할 수 있습니다 전술 한 규칙 (지수 및 가수의 모든 비트 1 = 0).

+0

마지막 문장은 의미가 없습니다. 'Double.doubleToLongBits (...)'는 암시 적으로'double'으로 변환되어 autoboxed되고 * reference *에 의해 'n2'로 비교되는'long'입니다. – finnw

+0

아마도 마지막 줄에'Double.doubleToLongBits (n2)! = Double.doubleToLongBits (Double.NaN)'이 있어야할까요? –

+0

'falseTo'는'doubleToLongBits'가 모든 NaN을 같은 값으로 변환하기 때문에 출력합니다. 그러나 'doubleToRawLongBits'를 사용하면 사실입니다. – finnw

5

Java는 부동 소수점 수에 대해 IEEE 754을 사용하므로 규칙이 적용됩니다.

Wikipedia page on NaN에 따르면 그것은 다음과 같이 정의된다 :

IEEE 부동 소수점 표준 단 정밀도 NaN이의 비트 단위 예 : x 상관 없어 의미 x111 1111 1axx xxxx xxxx xxxx xxxx xxxx.

이렇게 많은 비트 패턴이 모두 NaN 값입니다.

+0

감사합니다. VM간에 이식성이 보장됩니까? –

+1

@imonn : 그 질문은 나를 잠시 멈추게 만들 것입니다. 정확히 어떻게 그 사실을 이용하고 싶습니까? 'double'의 NaN 값에서 대역 내 정보를 제출하려고합니까? –

+0

나는 NaN처럼 행동하는 몇 가지 다른 값이있는 시스템의 의미를 에뮬레이트하려고 노력하고 있지만, 구별 할 수 있습니다. –