[java] “(i == i);”하는 방법 단일 스레드 응용 프로그램에서 무한 루프가 아닌가?

방금 대답 할 수없는 질문이 있습니다.

Java에이 루프 정의가 있다고 가정하십시오.

while (i == i) ;

루프가 무한 루프가 아니고 프로그램이 하나의 스레드 만 사용 하는 경우 의 유형 i과 값은 무엇입니까?i



답변

double i = Double.NaN;

Double.equals () 용 API는 “Double.NaN == Double.NaN의 값은 false”입니다. 이것은 ” 부동 소수점 유형, 형식 및 값 ” 의 Java 언어 사양에 자세히 설명되어 있습니다 .

NaN수치 비교 연산자, 그래서 순서가있다 <, <=, >, 및 >=
반환 false하나 또는 두 피연산자가있는 경우 NaN. 항등 연산자의 ==반환 false피연산자 인 경우 NaN, 그리고 비항 등 연산자의 !=반환 true피연산자 인 경우 NaN. 특히, x!=xtrue경우에만 xISNaN 하고 (x<y) == !(x>=y)있을 것입니다 false경우 x또는 y이다 NaN.


답변

그러면 값이 i유효하지 않습니다. “숫자가 아님”.

인터넷 검색 후 Java에서 NaN (Not a Number)을 가질 수 있음을 알았습니다! 따라서 Float Pointing 숫자는 데이터 유형이고 값은 NaN입니다. 여기를 참조 하십시오


답변

double i = Double.NaN;

NaN은 자체를 포함하여 어떤 것과도 같지 않습니다.


답변

float i = Float.NaN;
while(i == i) ;
System.out.println("Not infinite!");


답변

확실하지 않지만 (i == i) 멀티 스레드 프로세스에서 원자 연산이 아니라고 생각합니다. 따라서 루프를 실행하는 스레드에서 스택 값을 푸시하는 사이에 다른 스레드에 의해 i 값이 변경되면 해당 조건은 거짓이다.


답변

다른 사람들이 NaN이라고 말했기 때문에 공식 (JDK 6) 구현에 대해 궁금해했습니다 Double.isNaN.

/**
 * Returns <code>true</code> if the specified number is a
 * Not-a-Number (NaN) value, <code>false</code> otherwise.
 *
 * @param   v   the value to be tested.
 * @return  <code>true</code> if the value of the argument is NaN;
 *          <code>false</code> otherwise.
 */
static public boolean isNaN(double v) {
    return (v != v);
}


답변

Nan을 예외와 동등한 것으로 생각하지만 계산에서 마술 값을 사용합니다. 계산이 실패 했으므로 (예 : 음의 제곱근, 0으로 나누기 등) 다른 것과 비교하는 것은 의미가 없습니다. 결국 0으로 나누기가 nan이면 -2의 제곱근 또는 -3의 제곱근과 같습니다.

Nan은 추가 예외를 발생시키지 않고 유효하지 않은 답변을 반환하는 단계를 포함하는 계산을 허용합니다. 답이 가치인지 확인하려면 Float.isNan () o를 통해 nandness가 아닌지 테스트하십시오.