부동소숫점 끝판왕
[64Bit 비트열을 10진법 double로 변환하는 싸이트]
https://www.binaryconvert.com/convert_double.html
Double (IEEE754 Double precision 64-bit)
Sign Exponent Mantissa
www.binaryconvert.com
네가지 범위에 대한 64bit 표기법
- 0
- 0<x<1
- 1
- x>1
0.0
≠ [2진수] 1.0 * 2^-1023(2) => 부동소숫점 표기법으로 표현불가
= [64bit] 0 + 00000000000 + 0000000000 + 0000000000 + 0000000000 + 0000000000 + 0000000000 + 00
4.94065645841246544176568792868E-324 (Double의 최솟값 즉, 0 다음으로 큰 값)
= [2진수] 1.000········0001 * 2^-1023(2)
= [2진수] 0.000······0001000········0001(2)
= [64bit] 0 + 00000000000 + 0000000000 + 0000000000 + 0000000000 + 0000000000 + 0000000000 + 01
= [64bit] 0000000000000000000000000000000000000000000000000000000000000001
9.88131291682493088353137585736E-324
= [2진수] 1.000········0010 * 2^-1023(2)
= [2진수] 0.000······0001000········0010(2)
= [64bit] 0 + 00000000000 + 0000000000 + 0000000000 + 0000000000 + 0000000000 + 0000000000 + 10
= [64bit] 0000000000000000000000000000000000000000000000000000000000000010
14.821969375237396325297063786E-324
= [2진수] 1.000········0011 * 2^-1023(2)
= [2진수] 0.000······0001000········0011(2)
= [64bit] 0 + 00000000000 + 0000000000 + 0000000000 + 0000000000 + 0000000000 + 0000000000 + 11
= [64bit] 0000000000000000000000000000000000000000000000000000000000000011
19.7626258336498617670627517147E-324
= [2진수] 1.000········0100 * 2^-1023(2)
= [2진수] 0.000······0001000········0100(2)
= [64bit] 0 + 00000000000 + 0000000000 + 0000000000 + 0000000000 + 0000000000 + 0000000001 + 00
= [64bit] 0000000000000000000000000000000000000000000000000000000000000100
24.7032822920623272088284396434E-324
= [2진수] 1.000········0101 * 2^-1023(2)
= [2진수] 0.000······0001000········0101(2)
= [64bit] 0 + 00000000000 + 0000000000 + 0000000000 + 0000000000 + 0000000000 + 0000000001 + 01
= [64bit] 0000000000000000000000000000000000000000000000000000000000000101
29.6439387504747926505941275721E-324
= [2진수] 1.000········0110 * 2^-1023(2)
= [2진수] 0.000······0001000········0110(2)
= [64bit] 0 + 00000000000 + 0000000000 + 0000000000 + 0000000000 + 0000000000 + 0000000001 + 10
= [64bit] 0000000000000000000000000000000000000000000000000000000000000110
34.5845952088872580923598155008E-324
= [2진수] 1.000········0111 * 2^-1023(2)
= [2진수] 0.000······0001000········0111(2)
= [64bit] 0 + 00000000000 + 0000000000 + 0000000000 + 0000000000 + 0000000000 + 0000000001 + 11
= [64bit] 0000000000000000000000000000000000000000000000000000000000000111
39.5252516672997235341255034295E-324
= [2진수] 1.000········1000 * 2^-1023(2)
= [2진수] 0.000······0001000········1000(2)
= [64bit] 0 + 00000000000 + 0000000000 + 0000000000 + 0000000000 + 0000000000 + 0000000010 + 00
= [64bit] 0000000000000000000000000000000000000000000000000000000000001000
......
11125369292536006.9154511635867E-324
= [2진수] 1.000········1 * 2^-1023(2)
= [2진수] 0.000······0001000········0000(2)
= [64bit] 0 + 00000000000 + 1000000000 + 0000000000 + 0000000000 + 0000000000 + 0000000000 + 00
= [64bit] 00000000000010000000000000000000000000000000000000000000000000000
......
22250738585072008.8902458687609E-324
= [10진수] 2.22507385850720088902458687609E-308 (유효숫자16자리까지만 정확히 표현가능)
= [2진수] 1.1111111111111111111111111111111111111111111111111111 ······* 2^-1023
= [2진수] 0.0000···························11111111111111111111111111111111111111111111111111111
= [64bit] 0 + 00000000000 + 1111111111 + 1111111111 + 1111111111 + 1111111111 + 1111111111 + 11
= [64bit] 0000000000001111111111111111111111111111111111111111111111111111
.......
22250738585072013.8309023271733E-324
= [2진수] 1.000········1 * 2^-1022(2)
= [2진수] 0.000······0001000········0000(2)
= [64bit] 0 + 00000000001 + 0000000000 + 0000000000 + 0000000000 + 0000000000 + 0000000000 + 00
= [64bit] 00000000000100000000000000000000000000000000000000000000000000000
4,503,599,627,370,496개 숫자표현(지수bit는 모두0, 가수bit가 다양한 조합)
[10진수] 00.0
[1배] 04.94065645841246544176568792868E-324(Double.MIN_VALUE)
[2배] 09.88131291682493088353137585736E-324
[3배] 14.821969375237396325297063786E-324
[4배] 19.7626258336498617670627517147E-324
[5배] 24.7032822920623272088284396434E-324
[6배] 29.6439387504747926505941275721E-324
[7배] 34.5845952088872580923598155008E-324
[8배] 39.5252516672997235341255034295E-324
[9배] 44.4659081257121889758911913581E-324
[10배] 49.4065645841246544176568792868E-324
[11배] 54.3472210425371198594225672155E-324
[12배] 59.2878775009495853011882551442E-324
[13배] 64.2285339593620507429539430729E-324
[14배] 69.1691904177745161847196310016E-324
[15배] 74.1098468761869816264853189302E-324
...
...
[19배] 93.872472709836843393548070645E-324
[20배] 98.8131291682493088353137585736E-324
...
[29배] 143.279037293961497811204949932E-324
[30배] 148.21969375237396325297063786E-324
...
[2,251,799,813,685,248배]
11,125,369,292,536,006.9154511635867E-324
...
[4,503,599,627,370,495배]
22,250,738,585,072,008.8902458687609E-324 <-- 가수의 52bit를 모두 1로 채웠을 때
case1)
22250738585072008.8902458687609E-324
= [10진수] 2.22507385850720088902458687609E-308 (유효숫자16자리까지만 정확히 표현가능)
= [2진수] 1.1111111111111111111111111111111111111111111111111111 ······* 2^-1023
= [2진수] 0.0000···························11111111111111111111111111111111111111111111111111111
= [64bit] 0 + 00000000000 + 1111111111 + 1111111111 + 1111111111 + 1111111111 + 1111111111 + 11
= [64bit] 0000000000001111111111111111111111111111111111111111111111111111
case2) case1의 값의 2배
44501477170144017.7804917375217E-324
= [10진수] 4.45014771701440177804917375217E-308 (유효숫자16자리까지만 정확히 표현가능)
= [2진수] 1.11111111111111111111111111111111111111111111111111110 ······* 2^-1022
= [2진수] 0.0000····000000000011111111111111111111111111111111111111111111111111110
= [64bit] 0 + 00000000001 + 1111111111 + 1111111111 + 1111111111 + 1111111111 + 1111111111 + 10
= [64bit] 0000000000011111111111111111111111111111111111111111111111111110
[정리] 2진법정규화 지수가 -1023 이하일 경우 10진법 값의 두배는 2진법의 가수만 변화시킨다(대부분의 경우)
위 case1, case2는 두배를 했을 때, 가수부의 1값을 지닌 최상위bit가 지수로 침범하면서 가수와 진수가 함께 바뀌는 케이스가 있기도 하다.
---------------------------------------------------------------------------------------------------------------------------------
case3) case1의 값에 Double.MIN_VALUE 더한 값
22250738585072013.8309023271733E-324
= [10진수] 2.22507385850720138309023271733E-308
= [2진수] 1.0000···························1 * 2^-1022
= [2진수] 0.0000···························10000000000000000000000000000000000000000000000000000
= [64bit] 0 + 00000000001 + 0000000000 + 0000000000 + 0000000000 + 0000000000 + 0000000000 + 00
= [64bit] 0000000000010000000000000000000000000000000000000000000000000000
= [10진수] 4.45014771701440276618046543466E-308
= [2진수] 1.0000········0000000001 * 2^-1021
= [2진수] 0.0000········000000000100000000000000000000000000000000000000000000000000000
= [64bit] 0 + 00000000010 + 0000000000 + 0000000000 + 0000000000 + 0000000000 + 0000000000 + 00
= [64bit] 0000000000100000000000000000000000000000000000000000000000000000
---------------------------------------------------------------------------------------------------------------------------------
가수가 같은데 왜 값이 꼴이 다른경우가 생기지?(0<x<1, y>1 인 경우)
[비교1과 비교2]
꼴은 10진수에서 비교하는 것이 아님~! 2진수를 비교하면 꼴이 같다
[비교1] 22250738585072008.8902458687609E-324
= [10진수] 2.22507385850720088902458687609E-308 (유효숫자16자리까지만 정확히 표현가능)
= [2진수] 1.1111111111111111111111111111111111111111111111111111 ······* 2^-1023
= [2진수] 0.0000···························11111111111111111111111111111111111111111111111111111
= [64bit] 0 + 00000000000 + 1111111111 + 1111111111 + 1111111111 + 1111111111 + 1111111111 + 11
= [64bit] 0000000000001111111111111111111111111111111111111111111111111111
[비교3] 22250738585072013.8309023271733E-324
= [10진수] 2.22507385850720138309023271733E-308 (유효숫자16자리까지만 정확히 표현가능)
= [2진수] 1.000000000010000000000000000000000000000000000000000000000000000 * 2^-1022(2)
= [2진수] 0.0000···························1000000000010000000000000000000000000000000000000000000000000000
= [64bit] 0 + 00000000001 + 0000000000 + 0000000000 + 0000000000 + 0000000000 + 0000000000 + 00
= [64bit] 0000000000010000000000000000000000000000000000000000000000000000
0.1
= [10진수] 0.0999999999999999916733273153113 (유효숫자16자리까지만 정확히 표현가능)
= [2진수 무한소수] 1.1001100110011001100110011001100110011······* 2^-4
= [2진수] 0.00011001100110011001100110011001100110011·····
= [64bit] 0 + 01111111011 + 1001100110 + 0110011001 + 1001100110 + 0110011001 + 1001100110 + 01
= [64bit] 0011111110111001100110011001100110011001100110011001100110011001
0.2
= [10진수] 0.199999999999999983346654630623 (유효숫자16자리까지만 정확히 표현가능)
= [2진수 무한소수] 1.1001100110011001100110011001100110011···· * 2^-3
= [2진수] 0.0011001100110011001100110011001100110011001100110011001
= [64bit] 0 + 01111111100 + 1001100110 + 0110011001 + 1001100110 + 0110011001 + 1001100110 + 01
= [64bit] 0011111111001001100110011001100110011001100110011001100110011001
0.4
= [10진수] 0.399999999999999966693309261245 (유효숫자16자리까지만 정확히 표현가능)
= [2진수 무한소수] 1.1001100110011001100110011001100110011···· * 2^-2
= [2진수] 0.011001100110011001100110011001100110011001100110011001
= [64bit] 0 + 01111111101 + 1001100110 + 0110011001 + 1001100110 + 0110011001 + 1001100110 + 01
= [64bit] 0011111111011001100110011001100110011001100110011001100110011001
0.25
= [2진수] 0.01
= [2진수] 1.0 * 2^-2
= [64bit] 0 + 01111111101 + 0000000000 + 0000000000 + 0000000000 + 0000000000 + 0000000000 + 00
= [64bit] 0011111111010000000000000000000000000000000000000000000000000000
0.5
= [2진수] 0.1
= [2진수] 1.0 * 2^-1
= [64bit] 0 + 01111111110 + 0000000000 + 0000000000 + 0000000000 + 0000000000 + 0000000000 + 00
1
= [2진수] 1
= [2진수] 1.0 * 2^0
= [64bit] 0 + 01111111111 + 0000000000 + 0000000000 + 0000000000 + 0000000000 + 0000000000 + 00
= [64bit] 0011111111110000000000000000000000000000000000000000000000000000
| 누적 종류의 수(0은 편의상 논외) | 표현가능한 수(0은 편의상 논외) |
| 1 | 1,2,4,8,16,32,64,128,,,,, XXE+308 |
| 2 | 3,6,12,24,48,96,,,YYE+308 |
| 3 | 5,10,20,40,80,160,,,,ZZE+308 |
| .... | |
| n | 2n-1, (2n-1)*2, (2n-1)*4, (2n-1)*8,,,,,TTE+308 |
| 4.5E15 | 9.0E15, 18.0E15, 36.0E15, ,,,,,UUE+308 |
0.1
= [10진수] 0.0999999999999999916733273153113 (유효숫자16자리까지만 정확히 표현가능)
= [2진수 무한소수] 1.1001100110011001100110011001100110011······* 2^-4
= [2진수] 0.00011001100110011001100110011001100110011·····
= [64bit] 0 + 01111111011 + 1001100110 + 0110011001 + 1001100110 + 0110011001 + 1001100110 + 01
= [64bit] 0011111110111001100110011001100110011001100110011001100110011001
35601181736115219.1650498484298E-324 위 숫자인 0.1로 만들려면 2^1018을 곱하면 된다.
= [10진수] 3.56011817361152191650498484298E-308 (유효숫자16자리까지만 정확히 표현가능)
= [2진수 무한소수] 1.1001100110011001100110011001100110011001100110011001······* 2^-1022
= [2진수] 0.00·····011001100110011001100110011001100110011001100110011001·····
= [64bit] 0 + 00000000001 + 1001100110 + 0110011001 + 1001100110 + 0110011001 + 1001100110 + 01
= [64bit] 0000000000011001100110011001100110011001100110011001100110011001