2016-06-17 4 views
9

그래서 나는 최근에 kotlin이라는 언어를 사랑하기 시작했습니다. 오늘날, 복식을 비교하는 동안 나는 필연적으로 NaN을 발견했습니다.Kotlin의 NaN 비교

fun main(args: Array<String>) { 
    val nan = Double.NaN 
    println("1: " + (nan == nan)) 
    println("2: " + (nan == (nan as Number))) 
    println("3: " + ((nan as Number) == nan)) 
} 

NB :

1: false 
2: true 
3: true 

내가 자바 NaNcomparingfalse을 반환 이해 : 위의 코드 수율을 실행

(DoubleNumber의 하위 유형입니다) , 그래서 나는 기대할 것이다모든 표현식에 대해.

이 동작을 어떻게 설명 할 수 있습니까? 그 이유는 무엇입니까? JVM에 double 원시적는 박스 하나에 비교 될 수 없습니다 (2)(3) 원시적 권투 컴파일 된 후 Double.equals 검사가 있기 때문이다

답변

8

.

Double.equals

은 다시 두 Double의의 doubleToLongBits(...)을 비교하여 평등을 확인하고 후자에 대한 인수가 NaN

경우, 결과는 0x7ff8000000000000L 것을 보장이있다.

그래서, 비트 NaN가 동일한 두 반환하고, 규칙 NaN != NaN 여기에 무시됩니다. 또한

는 언급 @miensol ,이 동등 검사의 또 다른 결과있다 : +0-0==는 체크되지 equals 수표에있어서 동일하다. 자바

상응하는 코드는 다음과 같습니다

double nan = Double.NaN; 
System.out.println("1: " + (nan == nan)) //false 
System.out.println("2: " + ((Double) nan).equals(((Number) nan))) 
System.out.println("3: " + ((Number) nan).equals(nan)); 

마지막 두 줄이 doubleToLongBits(...)을 비교, Double.equals를 호출합니다.

double left = Double.NaN; 
double right = Double.NaN; 
boolean result = left == right; 

그리고 당신은 read in this answer이를 위하여 표준화 및 동작을 문서화 할 수있는 :

+2

나는 당신이 [문서]에서 다음 줄 (https://docs.oracle.com/javase/7/docs/api/java/lang/를 언급하는 경우 당신의 대답은 더 완전 할 것이라고 생각 ** doubleToLongBits'의 Double.html # doubleToLongBits (double)) : ** 모든 NaN 값이 단일 "표준"NaN 값 **으로 축소된다는 점을 제외하고 **. 그렇지 않으면 두 개의 다른 NaN이 함수와 false와 비교할 것이라고 생각할 수 있습니다. – nfs

+0

@nrohwer, 귀하의 의견을 보내 주셔서 감사합니다, 답변을 업데이 트되었습니다. – hotkey

7

첫 번째 비교는 자바의 동일합니다.Double.equals 사용

Double left = Double.valueOf(Double.NaN); 
Number right = Double.valueOf(Double.NaN); 
boolean result = left.equals(right); 

:

제 & 번째 비교

는 동등

유의 대부분의 경우, class Double, d1d2, 값의 두 인스턴스 d1.equals(d2)d1.doubleValue() == d2.doubleValue()의 값이 true 인 경우에만 true입니다. 모두 Double.NaN을 대표

  • d1 경우와 d2, 다음 등호 방법은 Double.NaN==Double.NaN이 값 false있는 경우에도, true를 반환하지만, 두 예외가 있습니다. +0.0==-0.0true 값을 가진다하더라도, -0.0, 또는 그 반대로, 동등한 시험 값을 갖는다 false를 나타낸다 +0.0d2 동안

  • d1는 경우이다.