2011년 2월 24일 목요일

C] 실수는 오차가 난다.

5.625를 메모리에 저장한다고 치자.
2진수로 변환하면
일단 5 부터 = 2로 슝슝 나누어서 나머지 역으로 보면 101이 나온다.
아니면 1 2 4 8 로 자리수가 나가니까
1 4 만 켜주면 되니까 101

0.625는 2를 곱해서 정수가 되는 넘만 적는다.
0.625*2 = 1.250
0.250*2 = 0.500
0.500*2 = 1

정수자리면 보면 101

그래서

101.101이 된다.

지수형태로 나타나면 .을 앞으로 땡기고

1.01101 * 2 * 2

가 된다. 뭐 2진수에 2자리 앞으로 땡겼으니까.

메모리 저장할 때는
부호부(sign bit) 1 bit
지수부(exponent bit) 8 bits
가수부(mantissa bits) 23bits
유효자리수(precision) 6~7
로 구성된다.

float 일 때, double일 때는 1, 11, 52, 15~16 이다.


위에서 지수부는 2*2 에서 2 이다. 앞에 2는 2진수를 뜻하고 뒤에 2가 가수부니까.

거기다가 127을 더한다. 이유는 음/양을 구분해야 하는데

8비트 전부 1을 써 넣으면 11111111 = 255 이기 때문에 중간값인 127을 넣는 것이다.
즉 127은 0을 뜻한다. 127+2 하니까 2가 되고 만약 127을 보다 낮은 값이면 음수란 거다.
지수부가 음수란 뜻이쥥... -> 점(.) 찍는 곳이 좌측이 아니라 우측으로 간다는 소리.

double형은 1023을 더한다.

가수부에 소수점 자리가 저장된다.

01101이 저장되겠지.  0.625 는 깔끔하지만 2를 계속 곱해도 안끝나는 녀석이 생기게 나름이다.

그래서 실수는 오차가 난다.(결론)




댓글 없음:

댓글 쓰기

국정원의 댓글 공작을 지탄합니다.

대학원생의 투고 지도 ④ (완결) — 논문의 수준이란 무엇인가: 사다리와 사분위, 첫 논문 전략

완결편이다. "논문 수준"이라는 말을 해부하고, 에듀테크 석사생의 첫 논문 전략으로 마친다. 학위논문과 학술지 논문은 다른 장르다 먼저 가장 흔한 혼동부터. 학위논문(thesis)은 "내가 연구를 수행할 줄 안다...