Notice
Recent Posts
Recent Comments
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Tags
more
Today
Total
관리 메뉴

차차로그

부동소수점 오류 본문

CS

부동소수점 오류

차차한 2022. 8. 2. 08:58
int a = 1;
double b = 0.7;

System.out.println(a-b); // 0.30000000000000004

위의 코드처럼 1에서 0.7을 빼면 0.3이 나와야하는데 결과는 '0.30000000000000004'이 나온다.

컴퓨터가 실수를 저장할 때 가수부와 지수부로 저장을 하게 되면서 나타나는 오류다.

가수부와 지수부로 저장하는 방식은 부동소수점 표현방식이다!

 

실수는 고정소수점 표현방식과 부동소수점 표현방식이 있다.

고정소수점 표현 방식은 10진수를 2진수로 변환해 자리에 맞게 그대로 표현하는 방식이다.

7.625라는 실수를 2진수로 변환하면 111.101가 되는데 이것을 정수부, 소수부 자리에 맞게 그대로 입력한다.

부호비트는 양수면 0, 음수면 1을 넣는다.

이러한 고정소수점 방식은 구현하기엔 편리하나 많은 수를 다 다룰 수 없고 정밀도가 떨어지기 때문에 거의 쓰이지 않는다.

 

부동소수점 표현 방식은 2진수로 변환 후 몇 가지 과정을 추가로 거치게 된다.

IEEE 표준에 따르면 부동소수점 방식으로 실수를 저장하는 데는 32비트, 또는 64비트가 사용. 그림은 32비트 기준                                                        출처: https://gsmesie692.tistory.com/94 [환상빛 별하늘: Reb∞t:티스토리]

과정 중에 정규화 과정이 있는데 정수부에 1만 남을 때까지 소쉄을 왼쪽으로 이동시키고 이동한 칸 수만큼 n자리에 넣으면 된다. (여기서 부동floating소수점이라는 말이 유래된 듯 하다)

부호비트는 양수면 0, 음수면 1을 넣는다.

가수부에는 정규화 결과 소수점 오른쪽 숫자들을 왼쪽부터 차례대로 넣고 빈 자리는 0으로 채운다.

지수부에는 2^n에서 n에 해당되는 수를 입력하는데 IEEE 표준에 따라 bias를 더해 넣는다.

32비트 기준으로 bias는 127이다.

7.625를 컴퓨가 인식할 때

결론! 0.3이 컴퓨터에 그대로 0.3으로 인식되는 것이 아닌 위와 같이 비트로 저장되기 때문에 0.1+0.2 가 0.3이 되지 않는다

int a = 1;
double b = 0.7;

System.out.println((a-b) == 0.3); // false

 

이러한 부동소수점 오류를 해결하기 위해 toFixed() 또는 Math.round()를 사용할 수 있다.

var a = 0.1
var b = 0.2
var c = a+b
console.log(c.toFixed(2)) // 0.30
console.log(Math.round((a+b)*1e12) / 1e12) // 0.3
 

컴퓨터에서의 실수 표현: 고정소수점 vs 부동소수점

어제 트위터 타임라인을 보다가, '부동소수점' 이라는 단어를 보면 어떻게 해석하게 되느냐는 그런 트윗이 RT로 넘어왔다. 생각해보니까 굉장히 비직관적인 단어다. 원래 영어단어는 floating point

gsmesie692.tistory.com

출처 : https://gsmesie692.tistory.com/94

'CS' 카테고리의 다른 글

SPA (Single Page Application)  (0) 2022.08.05
SVN Repository 가져오기  (0) 2022.08.04
로컬스토리지, 세션스토리지  (0) 2022.07.25
GET 방식, POST 방식  (0) 2022.07.25
Web 접근성, Web 표준  (0) 2022.07.25
Comments