programing

왜 Double일까요?NaN==더블.NaN 반환이 거짓입니까?

prostudy 2022. 9. 1. 21:15
반응형

왜 Double일까요?NaN==더블.NaN 반환이 거짓입니까?

OCPJP 질문을 공부하다가 이상한 코드를 발견했어요

public static void main(String a[]) {
    System.out.println(Double.NaN==Double.NaN);
    System.out.println(Double.NaN!=Double.NaN);
}

코드를 실행해 보니

false
true

출력은 어떻습니까?false우리가 서로 같아 보이는 두 가지를 비교할 때?무엇인가.NaN심술궂은가요?

NaN은 "번호가 아니다"를 의미합니다.

Java Language Specification (JLS; Java 언어 사양)제3판에서는 다음과 같이 기술하고 있습니다.

오버플로우는 부호 있는 무한대를 생성하고 언더플로우는 비정규화 값 또는 부호 있는 0을 생성하며 수학적으로 명확한 결과가 없는 연산은 NaN을 생성합니다.NaN을 오퍼랜드로 하는 모든 수치 연산은 결과적으로 NaN을 생성한다.이미 설명한 바와 같이 NaN은 순서가 매겨져 있지 않기 때문에 1개 또는2개의 NaN을 포함한 수치 비교 조작이 반환됩니다.false및 임의의!=NaN 수익에 관한 비교true,포함하여x!=x언제xNaN 입니다.

NaN은 정의상 NaN을 포함한 어떤 수치와도 동일하지 않다.이것은 IEEE 754 표준의 일부이며 CPU/FPU에 의해 구현됩니다.JVM이 지원하는 로직을 추가할 필요는 없습니다.

http://en.wikipedia.org/wiki/NaN

NaN과의 비교에서는 그 자체와 비교해도 항상 순서가 없는 결과가 반환됩니다.등식 및 부등식 술어는 비균등적이어서 x = x 반환 false를 사용하여 x가 조용한 NaN인지 여부를 검정할 수 있습니다.

Java는 모든 NaN을 Quiet NaN으로 취급합니다.

왜 그런 논리인가

NaN수단Not a Number숫자가 아닌 것은 무엇입니까?아무거나.한쪽에는 무엇이 있고 다른 한쪽에는 무엇이 있을 수 있기 때문에 양쪽이 동등하다는 것을 보증하는 것은 아무것도 없습니다. NaN로 계산됩니다.Double.longBitsToDouble(0x7ff8000000000000L)그리고 문서에서도 알 수 있듯이longBitsToDouble:

인수가 범위 내의 값인 경우0x7ff0000000000001L통해.0x7fffffffffffffffL또는 범위 내0xfff0000000000001L통해.0xffffffffffffffffL그 결과,NaN.

또한.NaN는 API 내에서 논리적으로 처리됩니다.


문서

/** 
 * A constant holding a Not-a-Number (NaN) value of type
 * {@code double}. It is equivalent to the value returned by
 * {@code Double.longBitsToDouble(0x7ff8000000000000L)}.
 */
public static final double NaN = 0.0d / 0.0;

그나저나.NaN 코드 샘플로 테스트됩니다.

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

솔루션

사용할 수 있는 것은compare/compareTo:

Double.NaN이 방법에서는 그 자체와 동등하고 다른 모든 것보다 큰 것으로 간주됩니다.double값(포함)Double.POSITIVE_INFINITY).

Double.compare(Double.NaN, Double.NaN);
Double.NaN.compareTo(Double.NaN);

아니면...equals:

한다면this그리고.argument둘 다 나타나다Double.NaN, 그 다음에equals메서드 반환true,그럼에도 불구하고.Double.NaN==Double.NaN가치가 있다false.

Double.NaN.equals(Double.NaN);

질문에 대한 직접적인 답변은 아닐 수 있습니다.하지만 어떤 것이 같은지 확인하고 싶다면Double.NaN다음을 사용해야 합니다.

double d = Double.NaN
Double.isNaN(d);

하면 반환됩니다.true

Double의 자바독.NaN은 모든 것을 말한다.

Not-a-Number(NaN) ) 값을 doubleDouble.longBitsToDouble(0x7ff8000000000000L).

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★의 소스Double 정의하다NaN같이 말합니다.

public static final double NaN = 0.0d / 0.0;

설명하신 특별한 동작은 JVM에 유선 연결되어 있습니다.

Double Precision 번호에 대한 부동 소수점 산술의 IEEE 표준,

IEEE 2배 정밀 부동소수점 표준 표현에는 64비트 워드가 필요합니다.이 워드는 0 ~63의 번호로 왼쪽에서 오른쪽으로 표시됩니다.

여기에 이미지 설명 입력 어디서, 어디서,

S: Sign – 1 bit
E: Exponent – 11 bits
F: Fraction – 52 bits 

ifE=2047(모두)E1 및 )의 개요F아닌 , 「0」이 됩니다.V=NaN

즉,

것이 「」인 경우.E 「1」에 제로 는, 「0」입니다.F 번호는 '아예'가 됩니다.NaN

때문에 그 중에서도 그, 른, 른, 음, 음, 음, 음, 음,NaN ,

0 11111111 0000000000000000010000000000000000000000000000000000 = NaN
1 11111111 0000010000000000010001000000000000001000000000000000 = NaN
1 11111111 0000010000011000010001000000000000001000000000000000 = NaN

특히 테스트 할 수 없습니다.

if (x == Double.NaN) 

(가) 하는지 Double.NaN숫자가 아니다 「」는 할 수 .Double.isNaN★★★★

if (Double.isNaN(x)) // check whether x is "not a number"

은 "아니다를 나타내는 입니다. NaN은 "숫자가 아니다"와 특정 산술입니다.이것은 다음과 같은 무효한 산술 연산의 결과입니다.sqrt(-1)및 (때로는 귀찮은) 특성이 있습니다.NaN != NaN.

숫자는 결과를 숫자로 나타낼 수 없는 작업의 결과를 나타냅니다.가장 유명한 연산은 0/0이며, 결과는 알 수 없습니다.

이 때문에 NaN은 어떤 값(기타 not-a-number 값 포함)과도 동일하지 않습니다.자세한 내용은 위키피디아 페이지를 참조하십시오.http://en.wikipedia.org/wiki/NaN

링크에 따르면, 그것은 다양한 상황을 가지고 있고 기억하기 어렵다.이것이 내가 그들을 기억하고 구별하는 방법이다. NaN예를 들어 "0을 0으로 나눈 결과는 정의되지 않았습니다"를 의미하며, 정의되지 않았기 때문에 "정의되지 않은 것과 관련된 비교는 정의되지 않았습니다"를 의미합니다.게다가, 그것은 수학적 전제조건에 더 가깝습니다.반면 양의 무한과 음의 무한은 모두 미리 정의되고 확정적입니다. '이렇게 하다.

변수가 있는 경우

Double a = Double.NaN

사용하다

String.valueOf(Double.NaN) == a.toString()

언급URL : https://stackoverflow.com/questions/8819738/why-does-double-nan-double-nan-return-false

반응형