[java] Double.MIN_VALUE가 음수가 아닌 이유

Double.MIN_VALUE실제로 실제로 Doubles가 취할 수있는 최소값이 아닌 이유에 대해 누구나 알 수 있습니까? 양수 값이며 Double은 음수 일 수 있습니다.

유용한 숫자 인 이유를 이해하지만 특히와 비교할 때 매우 직관적이지 않은 이름 인 것 같습니다 Integer.MIN_VALUE. 그것을 Double.SMALLEST_POSITIVE또는 MIN_INCREMENT이와 유사한 것으로 부르면 의미가 더 명확합니다.

또한 Doubles가 취할 수있는 최소값은 얼마입니까? 그렇 -Double.MAX_VALUE습니까? 문서가 말하지 않는 것 같습니다.



답변

IEEE 754 형식에는 부호 용으로 예약 된 1 비트와 크기를 나타내는 나머지 비트가 있습니다. 이것은 오리고를 중심으로 “대칭 적”임을 의미합니다 (음수 값이 하나 더있는 정수 값과 반대). 따라서 최소 값은 부호 비트가 변경과 함께, 그래서 단순히 최대 값과 동일 , -Double.MAX_VALUE당신이 함께 표현 할 수있는 가능한 가장 작은 실제 숫자입니다 double.

나는 최대 크기Double.MAX_VALUE 로 보여야 한다고 생각하는데 ,이 경우 실제로 단순히 쓰는 것이 합리적 이다. 또한 최소 양의 값을 나타내는 최소 양의 값인 이유를 설명합니다 .-Double.MAX_VALUEDouble.MIN_VALUE

그러나 나는 네이밍이 약간 오도임을 동의합니다. 의미에 익숙해 Integer.MIN_VALUE져서 읽을 때 조금 놀랐습니다.Double.MIN_VALUE 표현할 수있는 가장 작은 절대 값을 . 아마도 그들은 단순히 가능한 한 최소한의 값을 나타내는 상수를 갖는 것이 불필요하다고 생각했을 -것입니다 MAX_VALUE🙂

(또한 Double.NEGATIVE_INFINITY“특별한 경우”로 보이며 실제로 실제 숫자를 나타내지 않기 때문에 이것을 무시하고 있습니다.

여기 주제에 관한 좋은 글이 있습니다.


답변

이 상수는 부호와 관련이 없습니다. Double을 Sign, Exponent 및 Mantissa의 세 부분으로 구성하면 더 합리적입니다. Double.MIN_VALUE는 실제로 0으로 플러시되기 전에 지수가 최소값에있을 때 가수가 가정 할 수있는 가장 작은 값입니다. 마찬가지로 MAX_VALUE는 무한대에 플러시가 발생하기 전에 지수가 최대 값에있을 때 Mantissa가 가정 할 수있는 가장 큰 값으로 이해 될 수 있습니다.

이 두 가지에 대한보다 구체적인 이름은 가장 큰 절대 값 ( verbositiy에 0이 아닌 값 추가 )과 가장 작은 절대 값 (verbositiy에 대한 무한대 추가) 일 수 있습니다.

자세한 내용 은 IEEE 754 (1985) 표준을 확인하십시오. 개정 된 (2008) 버전이 있지만, Java에서 지원하지 않는 더 많은 형식 만 소개합니다 (엄격히 말하면 java는 다른 많은 고급 언어와 마찬가지로 IEEE 754 1985의 일부 필수 기능에 대한 지원이 없음).


답변

혼란스러운 이름을 가장 작은 양수로 정의 된 C추적 할 수 있다고 가정합니다 FLT_MIN.

Java에서와 같이을 -Double.MAX_VALUE사용해야 -FLT_MAX하는 경우 C에서 가장 작은 부동 소수점을 얻는 데 사용해야 합니다.


답변

double의 최소값은 Double.NEGATIVE_INFINITY이것이 Double.MIN_VALUE실제로 최소값이 아닌 이유 입니다 Double.

double은 부동 소수점 숫자이므로 가장 큰 숫자 (정밀도가 낮은 숫자) 또는 0에 가장 가까운 숫자 (정밀도가 높은 숫자) 만 가질 수 있습니다.

무한대가 아닌 double의 최소값을 정말로 원한다면을 사용할 수 있습니다 -Double.MAX_VALUE.


답변

부동 소수점 숫자 의 경우 정확한 범위 가 없으므로 정밀도 가 중요 합니다 .

/**
 * A constant holding the smallest positive nonzero value of type
 * <code>double</code>, 2<sup>-1074</sup>. It is equal to the
 * hexadecimal floating-point literal
 * <code>0x0.0000000000001P-1022</code> and also equal to
 * <code>Double.longBitsToDouble(0x1L)</code>.
 */

그러나 나는 아마도 더 나은 것으로 명명되었을 것입니다 🙂


답변

는 말한다으로 문서 ,

Double.MIN_VALUE는 double 유형 의 가장 작은 POSITIVE 0이 아닌 값 2 ^ (-1074)를 유지하는 상수 입니다.

여기서 요점은 부동 소수점 숫자 표현에 대해 이야기하고 있습니다. 배정도 데이터 형은 배정도 64 비트 IEEE 754 부동 소수점입니다. 부동 소수점은 1,000,000,000,000 ~ 0.0000000000000001의 숫자를 쉽게 나타내며 스케일의 양쪽 끝에서 정밀도 (자릿수)를 최대화합니다. (기타 참조 들어 이것을 )

항상 양수 가수는 , 부동 소수점 숫자의 유효 숫자를 보유하고 있습니다. 지수는 가수와 부호를 곱해야하는 기수의 양수 또는 음수를 나타냅니다. 부동 소수점 값을 얻기 위해 다음 네 가지 구성 요소가 결합됩니다 .

여기에 이미지 설명을 입력하십시오

MIN_VALUE는 가수가 나타낼 수있는 최소값이라고 생각하십시오. 부동 소수점 표현의 최소값은이를 사용하여 표현할 수있는 최소 크기입니다. (이 혼란을 피하기 위해 더 나은 이름을 사용했을 수도 있습니다)

123> 10> 1> 0.12> 0.012> 0.0000123> 0.000000001> 0.0000000000000001

아래는 참고 용입니다.

배정 밀도 부동 소수점은 2 ^ -1074에서 2 ^ 1023까지 2의 2,098 제곱을 나타낼 수 있습니다. 2의 정규화되지 않은 검정력은 2 ^ -1074에서 2 ^ -1023까지입니다. 정규화 된 2의 거듭 제곱은 2 ^ -1022에서 2 ^ 1023까지입니다. 이것이것을 참조하십시오 .


답변