2013-04-01 2 views
5

나는 이것에 대해 조금 궁금해했습니다. Math.random()은 [0.0,1.0] 범위의 값을 제공합니다. 그렇다면 가장 큰 가치는 무엇일까요? 즉, 1.0에 가장 가까운 double 값이 1.0보다 작은 것은 무엇입니까?Java : Math.random() 최대 값 (2를 1보다 작음)

답변

6

자바하지만 아무 것도 볼 수 있었다 전에 1.0-Double.MIN_NORMAL (308)에 소수점 이하 자릿수의 값을 출력해야 할 것이다 것은 64 비트를 IEEE-754 표현을 사용하기 때문에보다 작은 가장 가까운 수는 16 진수 표현에 이론적으로 3FEFFFFFFFFFFFFF 인 지수의 경우 0, 지수의 경우 -1, 52 비트 유효 숫자는 1.9999999999999997입니다. 이것은 대략 0.9999999999999998과 같습니다.

참조 : IEEE-754 Calculator.

+1

약 0.9999999999999999? 그것은 자릿수가 같지만 끝에 8 대신 9를가집니다. 내가'System.out.println (0.9999999999999999 - 0.9999999999999998)'일 때, 나는 다음을 얻는다. 1.1102230246251565E-16 – Justin

+1

@gangqinlaohu 마지막 숫자가 정확하지 않다. 번호를 얻으려면 IEEE-754 계산기에서 얻은 숫자를 잘라 냈습니다 (대답의 링크 참조). 8 다음의 다음 숫자도 8이므로 반올림을 적용하면 결과는 0.9999999999999999가됩니다. – dasblinkenlight

+1

0.9999999999999998이 잘 리므로 0.9999999999999999가 0.9999999999999998보다 가깝습니다. 따라서 가장 가까운 Double은 0.9999999999999999입니다. – Justin

0

두 배의 최소 양수 값은 Double.MIN_NORMAL입니다. 따라서 1.0보다 작은 숫자는 1.0-Double.MIN_NORMAL입니다.

Double.MIN_NORMAL 2 -1022 동일하므로 응답이 여전히 1.0에 매우 근접이다. 당신이 9

+2

이상하게도, System.out.println에'1.0 - Double.MIN_NORMAL == 1.0'을 넣을 때, 나는 사실이됩니다. 하지만 System.out.println에서 0.9999999999999999를 감싸면 false가됩니다. 그렇다면 0.9999999999999999가 가장 가까운 이중 값입니까? – Justin

+0

Hum ... 아닙니다. 따라서 MIN_NORMAL은 _closest 값을 0으로 적용합니다. 이는 IEEE-754 값에서 가능한 가장 작은 오류를 정렬합니다. 그러나 당신이 1쪽으로 움직 였기 때문에, 정밀도의 일부가 손실됩니다! – mjv

+0

'System.out.println (Double.MinNormal)'은 2.2250738585072014E-308입니다. 꽤 작습니다. – Justin

4

원하는 번호는 Math.nextAfter(1.0, -1.0)에 의해 반환됩니다.

기능의 이름은 다소 틀린 이름입니다. Math.nextAfter(a, 1.0) 초과 a 인 적어도 두 값을 반환 (즉, 다음 a 후의 값), 및 리턴 Math.nextAfter(a, -1.0) (a 전에 즉, 값 ) 미만이다 a 최대 값.

참고 : 다른 포스터는 1.0-Double.MIN_NORMAL입니다. 그건 틀렸어요. 1.0-Double.MIN_NORMAL은 정확하게 1.0과 같습니다.