์ด์ ๋ถํฐ ํ ๋ฒ์ ์ ๋ฆฌํด์ ์ฌ๋ฆฌ๋ ค๊ณ ํ๋ ์ฃผ์ ์ธ๋ฐ, ์ด์ ์์ผ ๊ธ์ ์จ ๋ณธ๋ค.
๋๋ถ๋ถ์ ์ปดํจํฐ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์ 0.1 + 0.2 ๋ฅผ ์ฐ์ฐํ๋ฉด ์ ํํ ๊ฐ์ธ 0.3 ์ด ๋์ค์ง ์๋๋ค. ๋์ , ๊ทผ์ฌ๊ฐ์ธ 0.30000.... x ๊ฐ ๋์ค๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
์ฌ๋๋ณด๋ค ๋์ฑ ์ ํํ ์ฐ์ฐ์ ํ๋ ์ปดํจํฐ๊ฐ ์ด๋ฐ ์ค์ฐจ๋ฅผ ์ถ๋ ฅํ๋ค๋, ์ด์ํ ์ผ์ด๋ค. ํ์ง๋ง ์ด๋ ์ปดํจํฐ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๋ฐฉ๋ฒ์ด ์ฌ๋์ด ์ฐ์ฐ์ ํ๋ ๋ฐฉ๋ฒ๊ณผ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ์๊ธฐ๋ ํ์์ด๋ค. ์ฆ, ์คํ๋ ค ์ปดํจํฐ๊ฐ ์ฐ์ฐ์ ๋๋ฌด ์ ํํ๊ฒ ํ๊ธฐ ๋๋ฌธ์ ๋ฐ์ํ๋ side effect ์ธ ๊ฒ์ด๋ค.
์ปดํจํฐ์ ์ซ์ ์ฒด๊ณ
๋ชจ๋ ์ปดํจํฐ๋ค์ ์๋ฃ๋ฅผ ๋นํธ์ ๋ฐ์ดํธ (bit & byte)์ ์ ์ฅํ๋ค. ๋นํธ๋ ์ปดํจํฐ์์ ์ฌ์ฉํ๋ ๊ฐ์ฅ ์์ ๋ฐ์ดํฐ ๋จ์์ด๋ค. ํ๋์ ๋นํธ๋ 2์ง์ 1 ๋๋ 0์ผ๋ก ํํ๋์ด ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌ, ์ ์ฅ, ์ ์ก ํ ๋ ์ฌ์ฉ๋๋ค. ํ๋์ ๋ฐ์ดํธ๋ 8๊ฐ์ ๋นํธ๋ก ๊ตฌ์ฑ๋์ด ์๊ธฐ ๋๋ฌธ์, ํํ ๋งํ๋ "8๋นํธ", "16๋นํธ" ๋ฑ์ ํํ์ "1๋ฐ์ดํธ", "2๋ฐ์ดํธ" ์ ํํ๊ณผ ๋์ผํ๋ค.
์ปดํจํฐ ํ๋ก๊ทธ๋จ์ ์ธ๊ฐ์ด ์ฌ์ฉํ๋ ์ซ์ ์ฒด๊ณ์ธ 10์ง์๋ฅผ ์ ๋ ฅํด๋, ์ปดํจํฐ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋ ๋๋ 64๋นํธ์ ๋ถ๋์์์ (floating point) ์ฒด๊ณ๋ก ์ ์ฅ๋๋ค. ๋ฌด์จ ๋ง์ด๋ ํ๋ฉด,
- ์ ์ (0, 1, 2, -1, -2 ๋ฑ์ ์์ฐ์)
- ์ ์๊ฐ ์๋ ์ ๋ฆฌ์ (์ ํ์์, ์ํํ์ง ์๋ ๋ฌดํ์์)
- ์ํํ๋ ๋ฌดํ์์,
- n์ง์ (8์ง์, 16์ง์ ๋ฑ)
๋ฑ ์ด๋ ํ ์ซ์๋ฅผ ์ ๋ ฅํ๋ , ๋ชจ๋ ์ซ์๋ (๊ทธ๋ฆฌ๊ณ ๋ชจ๋ ๋ฐ์ดํฐ ํ์ ์) 64๋นํธ์ง๋ฆฌ ์ปดํจํฐ ๋ฉ๋ชจ๋ฆฌ์ 2์ง์๋ก ์ ์ฅ๋๋ค๋ ๊ฒ์ด๋ค. (๋ฌผ๋ก , NaN ๊ณผ ๊ฐ์ด ํํ๋ถ๊ฐ๋ฅํ ๊ฒฐ๊ณผ๋ ์ ์ธํ๋ค.)
2์ง์ ๋น ๋ฅด๊ฒ ์ดํดํ๊ธฐ
2์ง์๋ ๊ธฐ๋ณธ์ ์ผ๋ก 2๋ฅผ ๋ฐ (base) ์ผ๋ก ํ๋ ์ ๊ณฑ๊ฐ์ ๊ธฐ๋ฐ์ผ๋ก ์ฐ์ฐํ๋ค. ์ง์๋ 0๋ถํฐ ์์ํ์ฌ 1์ฉ ์ฆ๊ฐํ๋ค. ์๋ ์ฐธ๊ณ ์ด๋ฏธ์ง๋ฅผ ํ์ธํ๋ฉด, ์ง์๊ฐ ์ค๋ฅธ์ชฝ์์ ์ผ์ชฝ ๋ฐฉํฅ์ผ๋ก 1์ฉ ์ฆ๊ฐํ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค. ๋ฐ์ธ 2์ ์ง์๋ฅผ ์ ๊ณฑํ ์ ๊ณฑ๊ฐ์ ๊ฐ๊ฐ ์ฐ์ฐํ ๋ค, ํฉ์ฐํ์ฌ 10์ง์๊ฐ ๋์ค๋ ๊ฐ๋ค์ ์ ๋ณํ์ฌ 2์ง์ 1๋ก ํ๊ธฐํ๊ณ , ํฉ์ฐ์ ํฌํจ๋์ง ์๋ ๊ฐ๋ค์ 0์ผ๋ก ํ๊ธฐํ๋ค.
์ด๋ ๊ฒ ์ ๋ ฅํ๋ 10์ง์๋ 2์ง์๋ก ๋ณํ๋์ด ์ฒ๋ฆฌ๋๋ค. (14 → 1110, 0.75 → 0.11, ๋ฌธ์์ ๊ฒฝ์ฐ ASCII ์ฝ๋)
๊ทธ๋ ๋ค๋ฉด, ์ด์ 0.1 + 0.2 = 0.3000004 ์ธ ์ด์ ๋ฅผ ๊ตฌ์ฒด์ ์ผ๋ก ์ดํด๋ณด์.
์ฐ๋ฆฌ๊ฐ ์ผ์์ ์ผ๋ก ๋ณด๋ ์ซ์๋ 10์ง์์ด์ง๋ง, ์์ ์ปดํจํฐ๋ ๋ชจ๋ ์ฐ์ฐ์ 2์ง์๋ก ์ํํ๋ค๊ณ ์ธ๊ธํ๋ค. ์ด๋ ๊ฒ 2์ง์๋ก ์ฐ์ฐ๋ ์๋ฅผ Binary Floating Point ๋ผ๊ณ ํ๋ค. ๊ฐ๋ น 23, 24 ๋ฑ์ 10์ง์ ์ ์๋ 1์ ์๋ฆฌ (10์ 0์ ๊ณฑ) ์ 10์ ์๋ฆฌ (10์ 1์ ๊ณฑ) ๊ฐ ํฉ์ฐ๋ ๊ฐ์ด๋, ์ปดํจํฐ๋ ์ด๋ฌํ ๋จ์๊ฐ 10์ ์ ๊ณฑ์ด ์๋ 2์ ์ ๊ณฑ์ด๋ค. ์ด๋ฌํ ์ฐ์ฐ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ๋ ์ ์๋ฅผ ๊ณ์ฐํ๋ ๊ฒ์ ํฐ ๋ฌธ์ ๊ฐ ๋์ง ์์ง๋ง, ์์์ ์ ์ ํํ ๋จ์ด์ง์ง ์๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
์๋ฅผ ๋ค์ด ์ ์ 10์ 2์ง์๋ก ํํํ๋ฉด 1010 ์ด์ง๋ง, 10.2๋ฅผ 2์ง์๋ก ํํํ๋ ค๊ณ ํ๋ฉด ์ด๋จ๊น? 10.2๋ 10๊ณผ 0.2 (2/10) ์ ํฉํ ๊ฐ์ด๊ธฐ ๋๋ฌธ์ ์ด 0.2๋ฅผ 2์ง์๋ก ํํํด์ผ ํ๋ค. 2์ง๋ฒ์์ ์์ซ์ ์ ์ฐ์ฐํ๋ ๋ฐฉ๋ฒ๋ ์ ์๋ฅผ ์ฐ์ฐํ๋ ๋ฐฉ๋ฒ๊ณผ ํฌ๊ฒ ๋ค๋ฅด์ง ์๋ค. 2์ ์์ ์ง์๋ฅผ ์ฌ์ฉํ์ฌ ์ง์๊ฐ 1์ฉ ์ค์ด๋ ์ ๊ณฑ๊ฐ์ ํฉ์ฐํ๋ค.
2์ง๋ฒ์์์ ์์ซ์ ์ ์ฐ์ฐ์ 2์ ์ ๊ณฑ๊ฐ์ ๋ถ๋ชจ๋ก ์ฌ์ฉํ 1/2, 1/4, 1/8 ... ๋จ์๋ก ์ํ๋๋ค. ๋ฐ๋ผ์, 10์ง์ 0.5๋ฅผ 2์ง์๋ก ํํํ๋ฉด 0.1 ์ด ๋๋ ๊ฒ์ด๊ณ , 10์ง์ 0.75 ๋ 0.5 + 0.25 ์ธ 0.11 ์ด ๋๋ค.
๊ทธ๋ ๋ค๋ฉด 0.1๊ณผ ๊ฐ์ ๊ฐ์ ์ด๋ป๊ฒ ์ฐ์ฐํ ๊น? 0.1์ 2์ง์ ๋จ์์ ์ ๊ณฑ๊ฐ๋ค์ ์กฐํฉ์ ํตํด ์ฐ์ฐ์ ์ํํด๋ ์ ํํ ๋จ์ด์ง๋ ๊ฐ์ ๋ด๊ธฐ ์ด๋ ต๋ค. ์ด๋ฐ ๊ฒฝ์ฐ ๊ณ์ํด์ 2์ง์์ ์์์ ์ ๋ฐ๋ผ ๋ด๋ ค๊ฐ ์ฐ์ฐ์ ํ๋ค๊ฐ, ๋ฌดํ์ฐ์ฐ์ ๊ตด๋ ์ ๋น ์ง๊ฒ ๋๋ค. ์๋ฐํ ๋ฐ์ง๋ฉด 10์ง์ 0.1์ 2์ง์ ํํ๊ฐ์ 0.00011111.... ๋ก ์์ํ๋ ๋ฌดํ์์๊ฐ ๋๊ฒ ์ง๋ง, ์ปดํจํฐ์ ๋นํธ ์์๋ ์ ํ์ด ์๋ค๋ ๊ฒ์ด ์ค์ํ ํฌ์ธํธ์ด๋ค. ์์ ๊ธฐ์ ํ๋ฏ ๋นํธ ํ๋๋น ์ด์ง์ ํ๋๋ฅผ ํํํ๊ธฐ ๋๋ฌธ์, 64๋นํธ ์ปดํจํฐ๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ๋ชจ๋ ๋นํธ๋ฅผ ์์์ ํํ์ ํ ์ ํ๋ค๊ณ ํด๋ ๋ฌดํ์์๋ฅผ ๋ค ๋ด์ ์๋ ์๋ค.
๋ฐ๋ผ์ 0.1 ๊ณผ 0.2 ์ ์ฐ์ฐ ๊ฒฐ๊ณผ๊ฐ 10์ง์๋ก๋ 0.3 ์ด์ง๋ง, 2์ง์๋ก ํํํ ๋๋ ๋นํธ์ ํ๊ณ๊ฐ ์์ด ๊ทผ์ฌ๊ฐ์ธ 0.300000004๋ก ํ์ํ๊ฒ ๋๋ ๊ฒ์ด๋ค.
์์ ๋ฌธ์ ๋ฅผ ๋ถ๋์์์ ์ฒด๊ณ์์ ์ด๋ป๊ฒ ํด๊ฒฐํ๋์ง ๋ ์์ธํ ์๊ธฐ ์ํด์๋ ๋ถ๋์์์ ์ฒด๊ณ์ ๊ตฌ์ฑ ์์์ ๋ํด ๋์ฑ ์์ธํ ์์์ผ ํ๋ค. ํํ ์ฌ์ฉ๋๋ 32๋นํธ ์ฒด๊ณ๋ฅผ ์์๋ก ๋ค์ด๋ณด๊ฒ ๋ค.
์์ ์ด๋ฏธ์ง์ ๋ํ๋๋ ์์๋ ํฌ๊ฒ 3๊ฐ์ง๊ฐ ์๋ค.
- Sign Bit : ํด๋น ์ซ์๊ฐ ์์์ธ์ง ์์์ธ์ง ํํํ๋ ์๋ฆฌ. 0 ์ด๋ฉด ์ (+), 1 ์ด๋ฉด ์ (-)
- Exponent : ๋ฉฑ์ง์ (๋ฐ์ 10)
- Mantissa : ์ค์ ํํ๋ ์ซ์์ ๊ฐ ๋๋ ์ซ์์ ๋ฒ์
32๋นํธ ์ปดํจํฐ๋ผ๋ฉด Sign 1๋นํธ + Exponent 8๋นํธ + Mantissa 23๋นํธ๋ก ๊ตฌ์ฑ๋๋ค. ์ฌ๊ธฐ์ ์ผ๋ฐ์ ์ธ ์ ์ ์ฐ์ฐ ๋๋ ์์ซ์ ์ฐ์ฐ์ ์ํํ๋ ๋นํธ๋ Mantissa ์ด๊ธฐ ๋๋ฌธ์, 32๋นํธ ์ฒด๊ณ์์ ํํํ ์ ์๋ ๋จ์ผ ์ซ์๊ฐ์ ์ต๋ 2^23 (8388608) ์ด๋ค.
์์๋ก, - 0.12345 ๋ฅผ 2์ง์๋ก ํํํ๋ค๊ณ ํด๋ณด์. ํด๋น ์ซ์์ Sign ๋นํธ๋ 1์ผ ๊ฒ์ด๊ณ , Mantissa ๋ 12345 ์ ํด๋นํ๋ 2์ง์๋ฅผ ํํํ ๊ฒ์ด๋ค. ๊ทธ๋ฆฌ๊ณ Exponent ์์ 10์ ๋ฉฑ์ง์๋ฅผ 5๋ก ํํํ์ฌ, Mantissa ์์ 10^5 ์ ์๋ฆฌ๋งํผ ์ด๋ํด์ผ ํจ์ ํ๊ธฐํ ๊ฒ์ด๋ค. (Exponent ์ ์ฒซ ๋ฒ์งธ ์๋ฆฌ๋ Sign ๋นํธ์ด๊ธฐ ๋๋ฌธ์, ํด๋น ๋ฉฑ์ง์๊ฐ ์์์ธ์ง ์์์ธ์ง ํ๋จํ ์ ์๋ค) ์ด๋ฌํ ์กฐํฉ์ ํตํด ๋ถ๋์์์ ์ ํํ์ด ์์ฑ๋๋ค.
์ฌ๋ฏธ์๋ ์ฌ์ค ํ๋๋, JavaScript ์๋ Infinity, -Infinity ๋ผ๋ ํน๋ณํ ๊ฐ๋ค์ด ์๋๋ฐ, ์ด๋ ์์ ๋ถ๋์์์ ์ซ์์ ํ๊ณ (์ต๋/์ต์๊ฐ) ๋ฅผ ๋์ด๊ฐ๋ ์ซ์๋ฅผ ์๋ฏธํ๋ ๊ฒ์ด๋ค.
์ฐธ๊ณ ์๋ฃ
https://ko.wikipedia.org/wiki/%EC%8B%AC%EB%B3%BC_%ED%85%8C%EC%9D%B4%EB%B8%94
'๐ป DEV > Javascript & NodeJS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JavaScript] ํด๋์ค (Class) (0) | 2021.12.12 |
---|---|
[Javascript] Generator (์ ๋ค๋ ์ดํฐ) (0) | 2021.10.26 |
[Javascript] Iterable (์ดํฐ๋ฌ๋ธ) (0) | 2021.10.13 |
[Javascript] ํด๋ก์ (Closure) (0) | 2021.10.06 |
[Javascript] ์คํ ์ปจํ ์คํธ (Execution Context) ์ ์์ค์ฝ๋ (0) | 2021.09.28 |
๋๊ธ