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를 계속 곱해도 안끝나는 녀석이 생기게 나름이다.

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




댓글 없음:

댓글 쓰기

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

UPBIT is a South Korean company, and people died of suicide cause of coin investment.

 UPBIT is a South Korean company, and people died of suicide cause of coin. The company helps the people who control the market price manipu...