왜 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
언제x
NaN 입니다.
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
Not-a-Number(NaN) ) 값을
double
Double.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
if
E=2047
(모두)E
1
및 )의 개요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
'programing' 카테고리의 다른 글
여러 데이터 포인트를 하나의 액션에 넘기는 경우VUEX (0) | 2022.09.01 |
---|---|
Vue.js 3 및 typescript : 속성 '$store'가 유형 'ComponentPublicInstance'에 없습니다. (0) | 2022.09.01 |
글로벌 vuex 워처 (0) | 2022.09.01 |
(익명의) 내부 클래스를 사용하는 것이 누출에 안전한 때는 정확히 언제입니까? (0) | 2022.09.01 |
Java에서 List 개체를 초기화하려면 어떻게 해야 합니까? (0) | 2022.08.31 |