컴퓨터공학

부동소숫점 끝판왕

데브원진 2022. 3. 6. 01:41

[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 

case4) case3의 값의 2배
44501477170144027.6618046543466E-324

   = [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 

 

[비교2] 1.79769313486231570814527423732E+308 (Double의 최댓값) 
   = [2진수] 1111········1111000········000
   = [2진수] 1.111········1111 * 2^1023
   = [64bit] 0 + 11111111110 + 1111111111 + 1111111111 + 1111111111 + 1111111111 + 1111111111 + 11       = [64bit] 0111111111101111111111111111111111111111111111111111111111111111

 

[비교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

2
  = [2진수] 10
  = [2진수] 1.0 * 2^1
  = [64bit] 0 + 10000000000 + 0000000000 + 0000000000 + 0000000000 + 0000000000 + 0000000000 + 00
 
3
   = [2진수] 11
   = [2진수] 1.1 * 2^1
   = [64bit] 0 + 10000000000 + 1000000000 + 0000000000 + 0000000000 + 0000000000 + 0000000000 + 00
 
4
   = [2진수] 100
   = [2진수] 1.0 * 2^2
   = [64bit] 0 + 10000000001 + 0000000000 + 0000000000 + 0000000000 + 0000000000 + 0000000000 + 00
 
5
   = [2진수] 101
   = [2진수] 1.01 * 2^2
   = [64bit] 0 + 10000000001 + 0100000000 + 0000000000 + 0000000000 + 0000000000 + 0000000000 + 00
 
6
   = [2진수] 110
   = [2진수] 1.1 * 2^2 
   = [64bit] 0 + 10000000001 + 1000000000 + 0000000000 + 0000000000 + 0000000000 + 0000000000 + 00
  
7
   = [2진수] 111
   = [2진수] 1.11 * 2^2
   = [64bit] 0 + 10000000001 + 1100000000 + 0000000000 + 0000000000 + 0000000000 + 0000000000 + 00
 
8
   = [2진수] 1000
   = [2진수] 1.0 * 2^3
   = [64bit] 0 + 10000000010 + 0000000000 + 0000000000 + 0000000000 + 0000000000 + 0000000000 + 00
 
9
   = [2진수] 1001
   = [2진수] 1.001 * 2^3
   = [64bit] 0 + 10000000010 + 0010000000 + 0000000000 + 0000000000 + 0000000000 + 0000000000 + 00
 
 
10
   = [2진수] 1010
   = [2진수] 1.010 * 2^3
   = [64bit] 0 + 10000000010 + 0100000000 + 0000000000 + 0000000000 + 0000000000 + 0000000000 + 00
 
 
123
   = [2진수] 1111011
   = [2진수] 1.111011 * 2^6
   = [64bit] 0 + 10000000101 + 1110110000 + 0000000000 + 0000000000 + 0000000000 + 0000000000 + 00
 
1.79769313486231570814527423732E+308 (Double의 최댓값) 
   = [2진수] 1111········1111000········000
   = [2진수] 1.111········1111 * 2^1023
   = [64bit] 0 + 11111111110 + 1111111111 + 1111111111 + 1111111111 + 1111111111 + 1111111111 + 11
   = [64bit] 0111111111101111111111111111111111111111111111111111111111111111
   
.......
.......
 
infinity
   = [2진수] 1.111········1111 * 2^1024
   = [64bit] 0 + 11111111111 + 0000000000 + 0000000000 + 0000000000 + 0000000000 + 0000000000 + 00
   = [64bit] 0111111111110000000000000000000000000000000000000000000000000000
NaN 
   = 1.000········0001 * 2^1024
   = 0 + 11111111111 + 0000000000 + 0000000000 + 0000000000 + 0000000000 + 0000000000 + 01
NaN
   = 0 + 11111111111 + 0000000000 + 0000000000 + 0000000000 + 0000000000 + 0000000000 + 10
NaN
   = 0 + 11111111111 + 0000000000 + 0000000000 + 0000000000 + 0000000000 + 0000000000 + 11
 
누적 종류의 수(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
n = 2^52 ≒ 4.5E15
 
 
 

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