Double.MIN_VALUE가 음수가 아닌 이유


157

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

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

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


1
답변 주셔서 감사합니다! 범위와 정밀도의 차이가 의미가 있습니다. 나는 여전히 이름이 매우 이상하고 일관성이 없다고 생각하지만 실행 가능합니다.
mo-seph

1
나는 그것을 writeBytes취하는 메소드 를 호출 한 동일한 천재들에 의해 쓰여졌 기 때문에 추측 하고 String있습니다.
Trejkaz

기본적으로, 당신 말이 맞습니다, 그것은 나쁜 의미입니다
Alvaro

답변:


180

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"특별한 경우"로 보이며 실제로 실제 숫자를 나타내지 않기 때문에 이것을 무시하고 있습니다.

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


3
고마워 통계 분석 코드를 이식하고 맹목적으로 Java를 C #으로 번역했습니다. -infinity 또는 NaN에서 일부 숫자가 나오는 것을 알고 알고리즘을 자세히 살펴 보았습니다. double.MIN_VALUE는 문맥 상 이해가되지 않으며 검색을 수행했습니다. 이 게시물은 Java 문서보다 먼저 제공됩니다. 그것은 실제로 두 배인 것에 대한 혼란스러운 이름입니다. 큰 문제는 아니지만 수정하는 데 1 분도 걸리지 않았지만 놀랍습니다.
Ed S.

"표현 될 수있는 가장 작은 절대 값"을 'epsilon'으로 명명하지 않습니까?
Dave Cousineau

@Sahuagin, 그것은 실제로 어떤 이름을 지어 질 것으로 "추정 된"것은 아닙니다. 엡실론은 수학 / 물리학에서 임의의 작은 양의 양을 나타내는 그리스 문자 일뿐입니다. SmallestNonzeroFloat64예를 들어 Go가 선택했습니다 .
aioobe

12

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

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

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


4

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

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


3

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

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

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


1
이 아이디어에 따르면 Double Double.MAX_VALUE 또는 Double.POSITIVE_INFINITY의 최대 값은 무엇입니까?
mo-seph

Double.MIN_VALUE같을 수 있습니다 Double.NEGATIVE_INFINITY.
starblue

@starblue, 아니오. @ mo-seph,, Double.POSITIVE_INFINITY+ ∞> 모두 및 —∞ <모두
Colin Hebert

@Colin Hebert,> = 및 <= 정확하게 말하면 ;-)
aioobe

당신은 아마 나를 오해했을 것입니다. 더 나은 세상에서, Double.MIN_VALUE동일한 것이다 Double.NEGATIVE_INFINITY다음은과 일치하는 것이기 때문에, MIN_VALUE정수 유형이다. 최대를 계산하기 위해 모든 변수를 초기화 MIN_VALUE할 수 있으며 정확합니다. Double.MIN_VALUE우리가 지금이 더 좋은 이름을 가질 것이다. (그리고 유사하게 MAX_VALUE.)
starblue

2

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

/**
 * 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.MAX_VALUE를 갖는 것이 합리적입니까? 명확하게 정의 된 것 같습니다.
mo-seph

그것의 부호를 설명하지 않는 최대의 정확한 값 (무한하지 않음) 때문입니다.
John Gardner

0

는 말한다으로 문서 ,

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까지입니다. 이것이것을 참조하십시오 .


감사합니다! 이 답변이 다운 보트 된 이유를 모르겠습니다.
결합
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.