방금 대답 할 수없는 질문이 있습니다.
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!=x
인true
경우에만x
ISNaN
하고(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가 아닌지 테스트하십시오.