0.0과 1.0 사이에는 몇 개의 이중 숫자가 있습니까?
이것은 수년 동안 내 마음 속에 있었던 일이지만 전에 묻지 않았습니다.
많은 (의사) 난수 생성기는 0.0에서 1.0 사이의 난수를 생성합니다. 수학적으로이 범위에는 무한한 숫자가 있지만 double
부동 소수점 숫자이므로 유한 정밀도를 갖습니다.
따라서 질문은 다음과 같습니다.
double
0.0과 1.0 사이에 몇 개의 숫자가 있습니까?- 1과 2 사이에 숫자가 많습니까? 100과 101 사이? 10 ^ 100과 10 ^ 100 + 1 사이?
참고 : 차이가 있다면 double
특히 Java의 정의에 관심이 있습니다.
Java double
는 IEEE-754 형식이므로 52 비트 분수를가집니다. 2의 인접한 두 거듭 제곱 사이에 (1을 포함하고 다음 것을 제외 함) 따라서 2의 52 제곱 다른 double
s (즉, 4503599627370496)가 있습니다. 예를 들어, double
포함 된 0.5와 제외 된 1.0 사이 의 구별되는 s 의 수 이며 정확히 많은 수가 포함 된 1.0과 제외 된 2.0 사이에 있습니다.
doubles
0.0에서 1.0 사이를 세는 것은 2의 거듭 제곱 사이에서 계산하는 것보다 어렵습니다. 그 범위에 포함 된 2의 거듭 제곱이 많고 비정규 화 된 숫자의 까다로운 문제에 빠지기 때문입니다. 지수의 11 비트 (10)는 비정규 번호를 포함, 그래서 문제의 범위를 커버하지 (나는 몇 가지를 생각 NaN
하면 1024 배에있는 것) double
두 세력 사이에 누워들 - 더 이상의 2**62
총 어쨌든에서 . 비정규 화 된 & c를 제외하면 카운트는 1023 회라고 생각합니다 2**52
.
"100에서 100.1"과 같은 임의의 범위의 경우 상한이 정확히 a로 표현 될 수 없기 때문에 더 어렵습니다 double
(2의 제곱의 정확한 배수가 아님). 편리한 근사치로, 2의 거듭 제곱 사이의 진행이 선형이므로, 범위는 0.1 / 64
주변 2의 거듭 제곱 (64 및 128) 사이의 범위의 th 라고 말할 수 있습니다.
(0.1 / 64) * 2**52
뚜렷한 double
s-오는 7036874417766.4004
... 하나 또는 둘을 주거나 받거나 ;-).
모든 double
그 대표 값 사이 0x0000000000000000
및 0x3ff0000000000000
구간 [0.0, 1.0]에있다. 그것은 (2 ^ 62-2 ^ 52) 고유 한 값입니다 (끝점 계산 여부에 따라 더하기 또는 빼기).
간격 [1.0, 2.0]은 0x3ff0000000000000
과 사이의 표현에 해당합니다 0x400000000000000
. 그것은 2 ^ 52 개의 고유 한 값입니다.
간격 [100.0, 101.0]은 0x4059000000000000
과 사이의 표현에 해당합니다 0x4059400000000000
. 그것은 2 ^ 46 개의 고유 한 값입니다.
10 ^ 100과 10 ^ 100 + 1 사이에는 복식이 없습니다 . 이 숫자 중 어느 것도 배정 밀도로 표현할 수 없으며 그 사이에있는 배정 밀도도 없습니다. 가장 가까운 두 배정 밀도 숫자는 다음과 같습니다.
99999999999999982163600188718701095...
과
10000000000000000159028911097599180...
다른 사람들은 이미 [0.0, 1.0] 범위에 약 2 ^ 62 두 배가 있다고 설명했습니다.
(정말 놀라운 일이 아닙니다 : 거의 2 ^ 64 개의 고유 한 유한 복식이 있습니다.이 중 절반은 양수이고 그 중 절반은 1.0 미만입니다.)
그러나 난수 생성기를 언급합니다. 0.0에서 1.0 사이의 숫자를 생성하는 난수 생성기 는 일반적으로 이러한 모든 숫자를 생성 할 수 없습니다 . 일반적으로 정수 n을 가진 n / 2 ^ 53 형식의 숫자 만 생성합니다 (예 : nextDouble에 대한 Java 문서 참조 ). 따라서 일반적으로 random()
출력에 대해 가능한 값은 약 2 ^ 53 (포함되는 끝점에 따라 +/- 1) 정도입니다 . 이는 [0.0, 1.0]에서 대부분의 double이 생성되지 않음을 의미합니다.
기사 Java의 새로운 수학, Part 2 : IBM의 부동 소수점 숫자 는이를 해결하기 위해 다음 코드 스 니펫을 제공합니다 ( 부동 수로 표시 되지만 이중 에서도 작동한다고 생각합니다).
public class FloatCounter {
public static void main(String[] args) {
float x = 1.0F;
int numFloats = 0;
while (x <= 2.0) {
numFloats++;
System.out.println(x);
x = Math.nextUp(x);
}
System.out.println(numFloats);
}
}
그들은 그것에 대해 다음과 같은 의견을 가지고 있습니다.
It turns out there are exactly 8,388,609 floats between 1.0 and 2.0 inclusive; large but hardly the uncountable infinity of real numbers that exist in this range. Successive numbers are about 0.0000001 apart. This distance is called an ULP for unit of least precision or unit in the last place.
- 2^53 - the size of the significand/mantissa of a 64bit floating point number including the hidden bit.
- Roughly yes, as the sifnificand is fixed but the exponent changes.
See the wikipedia article for more information.
The Java double is a IEEE 754 binary64 number.
This means that we need to consider:
- Mantissa is 52 bit
- Exponent is 11 bit number with 1023 bias (ie with 1023 added to it)
- If the exponent is all 0 and the mantissa is non zero then the number is said to be non-normalized
This basically means there is a total of 2^62-2^52+1 of possible double representations that according to the standard are between 0 and 1. Note that 2^52+1 is to the remove the cases of the non-normalized numbers.
Remember that if mantissa is positive but exponent is negative number is positive but less than 1 :-)
For other numbers it is a bit harder because the edge integer numbers may not representable in a precise manner in the IEEE 754 representation, and because there are other bits used in the exponent to be able represent the numbers, so the larger the number the lower the different values.
참고URL : https://stackoverflow.com/questions/2978930/how-many-double-numbers-are-there-between-0-0-and-1-0
'programing tip' 카테고리의 다른 글
2 단계 인증을 사용하여 https를 통해 GitHub에서 Git 클론 (0) | 2020.09.04 |
---|---|
'git pull origin mybranch'는 로컬 mybranch N이 원점보다 먼저 커밋합니다. (0) | 2020.09.04 |
오픈 소스 Java 프로파일 러 (0) | 2020.09.04 |
Java 스택 추적 덤프의 표시되는 행 수를 늘리려면 어떻게합니까? (0) | 2020.09.04 |
CSS를 사용하여 div 하단의 정렬 버튼 (0) | 2020.09.03 |