IEEE 754 표준에 따르면 부동소수점을 표현하는 방식에는
2가지가 있습니다.
JS에서는 64비트를 사용.
아래 3가지 부분으로 나뉨
부동소수점의 지수부를 표현하기 위한 방법.
만약 bias가 없어서 -4를 어떻게 표현할까요? 지수부에 부호 비트를 하나 더 만들어야 할까 하지만 이것대로 복잡해집니다.
초과표기법으로 인해 두 수의 크기를 비교를 할 경우
(부호가 같으면) 어느 하나의 가수부가 크더라도 지수가 큰 수가 더 큰 값인 것을 알 수 있다.
2진수의 정규화는 1.xxxx * 2^n의 형태.
가수부를 표현할 때 정규화된 맨 앞의 1을 생략하여 표현 범위를 늘림.
0 000 0000(2)을 정규화로 변환 시 : 1.00000 * 2^-3
십진수 : 0.125
즉 0이 0으로 표현 안되어 0으로 약속 하는 것.
아래와 같은 수 그리고 -inf
inf
nan
을 표현합니다.
8비트 부동소수점 표현 | 십진수 | |
---|---|---|
가장 작은 양의 실수 | 0 000 0001 | 0.1328125 |
가장 작은 음의 실수 | 1 000 0001 | -0.1328125 |
가장 큰 양의 실수 | 0 111 1111 | 31 |
가장 큰 음의 실수 | 1 111 1111 | -31 |
14.5 (10)
8+4+2 + 0.05
0.5 2 = 1
1110.1 (2)
1.1101 2^3
0 / 1000_0000_001 / 1101 0000 ... 0000
지수부 bias : 2^(8-1) -1 = 127
지수 = 3 + 127 = 128 + 2
부호 : 0
가수 : 1101
0 / 1000_0010 / 1101 0000 00..000
32비트 부동소수점 변환사이트 : https://www.h-schmidt.net/FloatConverter/IEEE754.html
위의 inf
nan
를 double precision을 기준으로
1111_1111_111 (2)로 지정되어 있기 때문에
가장 큰 지수비트는 1111_1111_110 (2)이다. ( 2^11 -1) = 1023
double precision에서 표현할 수 있는 가장 큰 양의 실수의 경우는
1 X 2^1023 X 1.11111111....
1 X 2^1023 X 2
= 2 ^ 1024
JS에서는 double precision을 사용하므로 표현 할 수 있는 가장 큰 값은
2의 1024 승이다. (Number.MAX_VALUE)
JS에서 Number.MAX_SAFE_INTEGER의 값은 2^53 -1
이라고 하는데
왜 이 숫자여야 하나?
64비트에서 52비트의 가수부를 정규화하여 1로 채운다면
1.1111111111..111
즉 53개의 1이 생긴다. (2^53 -1)
1.000......0001 의 경우 2^53 +2
1.000......0010 의 경우 2^53 + 4
2씩 증가하여 대소 비교는 가능하나 연산은 불가능하다.
2^53 - 1 이상의 수는 Bigint를 이용.
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=jwyoon25&logNo=221389077105