부동소수점과 실수 계산시 오차가 생기는 이유

pastaCoder·2022년 7월 27일
0

정수는 2진수 형태로 모두 표현이가능함

실제로 int는 4바이트로

32비트의 HIGH LOW 상태로 나타낼 수 있음

첫번째 비트가 부호 나머지 31비트의 절대값으로 나타낼 수 있음

그런데 실수는 10진수로 표현이 불가능한것들도 있음

1/3을 10진수로 나타내면 순환소수(0.3333...)가 되듯이 0.1도 2진수로 나타내면 무한소수가됨
그런 부분을 해결하기위해 부동소수점을 사용하는데 첫번째 1비트를 동일하게 부호로 표현하고
이후 8비트로 소숫점이 몇칸을 움직일지를 나타냄 나머지 23비트를 소수점 뒤로 오는부분들을 채워넣음

예를들어 0.1같은경우는
2진수로 0.000110011...으로 나타낼 수 있고,
소숫점이 반대쪽으로 4칸을 움직여야함
움직이게되면 1.100110011...이 되는데
부동소수점 방식으로는 8비트씩 끊어서 봤을때

빨간색 - 부호부
회색 - 지수부
노란색 - 가수부
0 0111101 11001100 11001100 11001101
지수부의 값은 바이어스 표현법을 이용해서 나타냄

바이어스 표현법

2의 보수법 + 바이어스 상수 = 바이어스 표현법 예를 들어 2의 보수법으로 127을 표현하면 0111 1111 이고 이를 바이어스 표현법으로 바꾸려면(float형) 127((2^8)-1)을 더하면 된다.0111 1111 + 0111 1111 = 1111 1110 (127 바이어스 법으로 표현한 127) 예) -0.4를 16부동 소수점으로 바꾸어라. ( 지수부 5bit, 가수부 10비트)0.4 = 0.0110011001100110...(2진수) = 1.1001100110...*2^-2따라서 지수부는 -2가 된다. -2를 2진수로 나타내면(2의보수법) 1 1110이 된다.지수부 비트가 5bit므로 바이어스 상수는 2^5-1 = 15 = 0 1111지수부를 바이어스 표현 법으로 나타내기 위해 위 두값을 더한다.1 1110 + 0 1111 = 0 1101따라서,1 0 1101 1001100110
출처: 바이어스 표현법 출처

0개의 댓글