2014-10-17 2 views
1

난 그냥 OCJP 문제를 공부하고 있었고, 난이 이상한 코드 발견 : 우리는 두 가지를 비교 할 때System.out.println (0.0 % 0.0! = 0.0/0.0); 뭘 할거 니? 답변을 설명해 주시겠습니까?

true 
false 

어떻게 출력 거짓 : 나는 코드를 실행하면, 내가 가진

public class abc { 
    public static void main(String[] args) { 


     System.out.println(0.0%0.0!=0.0/0.0);// it return true 

     System.out.println(0.0%0.0==0.0/0.0);// it return false 


    } 

} 

을 서로 똑같이 생겼어? NaN은 무엇을 의미합니까?

+0

그들은 모두 나에게 동일을 보지 않는다. 또는 오히려, 그들은'3 ** 4'와 마찬가지로'3/4'와 똑같습니다. –

+0

왜 평등이 사실이라고 생각합니까? –

답변

3

0.0/0.00.0 % 0.0 모두 Double.NaN입니다.

Double.NaN == Double.NaN을 비교하면 false이 표시되며 System.out.println(0.0%0.0==0.0/0.0);false입니다.

이제는 왜 Double.NaN == Double.NaN이 반환됩니까? false? JLS에 따르면

:

부동 소수점 연산자는 예외를 생성하지 않습니다 (§11). 오버플로되는 연산 은 부호가있는 무한대를 생성하고 언더 플로가 발생하는 연산은 비정규 화 된 값 또는 부호있는 0을 생성하며 수학적으로 명확한 결과가없는 연산은 NaN을 생성합니다. 모두 피연산자로 NaN을 사용한 숫자 연산은 NaN을 결과로 생성합니다. 이 이미 설명되었으므로 NaN은 순서가 지정되지 않으므로 하나 또는 두 개의 NaN이 포함 된 숫자 비교 연산은 false를 반환하고! = NaN과 관련된 비교는 true를 반환합니다. x! = x는 x가 NaN 인 경우를 포함하여 true를 반환합니다.

상세 정보 :

+0

중간에, 바이트 코드는 다음과 같습니다. 0 : getstatiC# 16; // java/lang/System.out 필드 : Ljava/io/PrintStream; ** 3 : iconst_1 ** 4 : invokevirtual # 22; // 메소드 java/io/PrintStream.println : (Z) V 7 : getstatiC# 16; // java/lang/System.out 필드 : Ljava/io/PrintStream; ** 10 : iconst_0 ** 11 : invokevirtual # 22; // 메소드 java/io/PrintStream.println : (Z) V 14 : return ... 왜 스택에 '0'과 '1'이로드되는지 이해가 안됩니다. – TheLostMind

관련 문제