본문 바로가기

바닐라코딩 부트캠프

quiz1) 0.1 + 0.2 === 0.3 ?

------------
0.1 + 0.2 === 0.3 ?

연산시 사용된 이론
자바스크립트에서 숫자는 => 64비트 floating point
floating point => 부동 소수점

부동소수점?
실수를 컴퓨터에 근사하여 표현할때 소수점 위치 고정 X
위치를 나타내는 수를 따로 적는다.

유효숫자 나타냄 => 가수
//유효숫자 : 근사값에서 반올림하지 않은 부분의 숫자나 측정하여 얻은 믿을 수 있는 숫자.
//근사값  : 실용상 지장이 없을 정도로 참값에 가까운 값,

소수점의 위치를 풀이 => 지수


부동 소수점의 방식으로 IEEE 754 사용
=>IEEE 754  : 부동소수점을 표현하는 가장 널리 쓰이는 표준이다.


- 일상적으로 사용하는 숫자 표현방식은 10진수입니다
ex)
16진수 : 7B
10진수 : 123
8진수 : 173
2진수 : 1111011

- 컴퓨터가 숫자 표현시  => 2진수 사용
2진수로 표현하지 못하는 소수가 발생
컴퓨터에는 표현할 수 있는 가장 근사치의 값이 저장

- 값이 부호 (1비트), 지수 (7비트), 가수(24비트) 3곳으로 값이 저장됨

ex)  263.3 =>  100000111.010011001100110
저장되는 방법
가장 앞자리 수 1 뒤에 소수점을 옮겨서 표현
=> 이것을 정규화된 부동소수점 수

부호 => 양수일 때는 0, 음수일 때는 1
지수 => 2^8의 8을 
가수 => 소수점 이후 숫자열 전체를


원리
우리가 콘솔에 입력 => 64 비트 IEEE 754 형식'에 따라 2진법으로 바뀜 => 그 결과를 다시 10진법으로 바꿈 => 화면 표시


정확도 문제
- 부동 소수점으로 표현한 수가 실수를 정확히 표현하지 못한다
- 부동소수점 사칙연산은 정수 사칙연산보다 부정확하다
=>오류가 아니라 IEEE-754에서 정의한 방식대로 계산했기 때문에 나오는 결과

0.1과 0.01을 표현하지 못하므로, 0.1의 제곱이 0.01이 되지도 않고 0.01과 가장 가까운 수가 되지도 않는다.


해결법
(0.1 + 0.2).toFixed(1);toPrecision
(0.1 + 0.2).toPrecision(1);
(0.2*10 + 0.1*10) /10


다른 언어에서도 똑같이 적용 된다.
=>0,1 + 0.2 === 0.3
파이썬 ,C , C++ , 자바 등등

// 볼수있는 사이트
https://0.30000000000000004.com/

-----------------
참고자료
https://velog.io/@sgyoon/2019-09-15-01
https://www.youtube.com/watch?v=lue2DP-zJO8
https://steemit.com/kr/@modolee/floating-point

'바닐라코딩 부트캠프' 카테고리의 다른 글

js 연습문제  (0) 2020.01.10
async) memoize 메모  (0) 2020.01.10
async) reduce 메모  (0) 2020.01.10
day2 문제 메모  (0) 2020.01.09
async 문제 메모  (0) 2020.01.07