소프트웨어 공학용 수학에 관련해서 pocu에서 공부하고 있다.
지난 학기 때, 실무 프로그래밍 입문을 공부하고 열심히 노트정리도 했지만, 중간고사, 기말고사가 각각 끝나고 리마인드 하지 않은게 후회됬다.
"공부를 제일 열심히 했을 때 기록해두면 장기기억으로 남았을 텐데"라고 말이다.
그래서, 요번에 중간고사가 끝난 때, 중요한 부분들을 다시 하나하나 정리하고자 한다.
어떤 것들을 정리할지 한번 생각해 보았는데 다음과 같다.
- 2의 보수의 개념과 필요성
- 컴퓨터에서 문자를 어떻게 표현하는가?
- 컴퓨터에서의 실수 표현
유리수와 무리수로 이루어진 체계이다.
유리수란? 두 정수의 비로 나타낼 수 있는 수 (분수로 나타낼 수 있는 소수)
cf) 정수는 유리수에 포함된다.
무리수란? 두 정수의 비로 나타낼 수 없는 수
그렇다면 컴퓨터가 사용하는 2진법에서의 10진법 실수는 어떻게 표현할까
2진법의 정수 표현에서 자리수가 커져갈수록 2^n승을 곱해서 표현했다.
반대로 소수점아래는 2^-n을 곱하면 된다.
예를 들어보자
Ob11.111 = 3.875가 되는데
11 = (2+1)
.111= ( 2^-1+2^-2+2^-3 = 0.5 + 0.25 + 0.125)
해서 3.875가 된다.
그렇다면 반대로 생각해보자
10진법 실수에서 0.5 => 0.1로 표현이 될것이고.
0.75 => 0.11 이 될 것이다.
그럼 0.1 같이 애매한 숫자는 어떻게 표현할까?
0.1은 무한소수로 표현되어서.. 0.000100010001 이런식으로 나타내게 된다.
(이러한 이유 때문에 실수 자료형에서는 오차가 생길 수 밖에 없다.
-> 뒤에서 32bit 실수 자료형의 유효범위에 대해 좀 더 자세히 설명하겠다.)
다음으로 고정 소수점과 부동 소수점에 대해 알아보자.
고정 소수점은 말 그대로 소수점이 고정된 자리에 있어서 비트를 읽을 때, 어느 비트 이전까지는 정수부분, 나머지 부분은 소수점 아래부분으로 읽는 것이다.
예를 들어 Q4,3으로 표현되면 7bit를 읽을 때, 상위 4비트는 정수부, 나머지는 소수점 아래부분으로 읽는다. 1111.111 이런식으로..
이런식으로 표현하게 되면 각각 장단점이 존재하게 되는데.
장점
단점
위의 고정 소수점은 이제 거의 사용하지 않는 방법이고, 실제로 사용되는 가장 중요한 부동 소수점에 대해 알아보자
부동 소수점이란?
소수점의 위치가 가변적이게 표현하는 것이다. ( 고정 소수점의 반대개념)
어떻게 표현할까?
32bit 부동소수점 표현에 대해서 어떻게 값을 나타내는지 설명하겠다.
우선, 부동 소수점을 표현하기 위해서는 과학적 표기법에 대해서 알아야 한다.
공대를 나온 사람이라면 이런 표현은 진짜 익숙할 것이다.
어떤 값들을 m x 10^n 으로 표현되는 것을 과학적 표기법이라고 한다.
m이 가수부 n이 지수부이다.
자 여기서 가수부는 지수부가 존재하는데. 32bit 부동 소수점수는 각각 bit를 쪼개서 가수부와 지수부를 나타낸다.
32bit = 1bit(부호비트) 8bit(지수비트) 23bit (가수비트) 로 구성되어 있다.

그림으로 보면 이해가 편할거 같아서, 가져와봤다.
자 그러면 이제 10진수 실수를 부동소수점수로 바꿔보도록 하자.
-118.625 를 아까 알려준 방식대로 2진법 실수로 바꿔보자
1110110.101이 된다.
이것을 과학적 표기법으로 바꾸면 1.11011010x 2^6이 된다.
(2진법이니까 당연히 2^n으로 표현하는건 아시겠쬬?)
여기서 11011010 이 가수부가 되고, 6이 지수부가 된다.
희안하게도 지수부 +127 을 해서 2진법으로 바꿔서 지수부 8bit에 저장하고
나머지 가수부를 23bit에 앞에서부터 차례로 넣는다 그러면?

다음과 같이 들어간다. 위의 예시는 블로그글을 가져와서 넣은 것이므로, Reference를 참조해봐도 좋을거 같다.
어쨋든, 컴퓨터에서 실수를 보편적으로 다음과 같이 표현한다. 64 bit는 방식이 같고, 가수부 지수부 bit수만 다르다.
위의 내용을 차례로 보면서, 어차피 컴퓨터가 알아서 해주는데 내가 이렇게 세밀하게 알아야해? 라고 할 수도 있겠다.
하지만, 위의 내용을 어느정도 이해한 상태에서,
강의에서 부동소수점의 정밀도는 6-9자리를 보장한다고 써져이쓴 공식문서에 대한 해석을 들을 수 있었다.
참 어려운 이야기인데, 정밀도는 값들이 주어질 때, 그 값들의 편차가 얼마나 작은지를 의미하는데 그것을 자리수로 표현하다니? 그리고 또 6자리 7자리 이렇게 표현하는 것이아닌 6~9자리를 표현한다니 이해가 안될 수 있다.
(사실 나도 강의를 들었지만, 완벽하게 이해가 가지는 않는다. 다만 정리된 내용을 머릿속에 넣고 필요할 때 찾아볼 수 있도록 할 생각이다.)
자 정밀도 6의 의미를 정리해보자
10진수 실수를 float에 저장 후, 다시 10진수로 바꿨을 때, 안전하게 복원되는 유효숫자가 6개란 의미이다. 만약, 유효숫자가 7개 이상이고, float 에 저장되었다가 돌아온다면, 이 숫자는 오차가 있는 값이 될 것이다.
이 부분이 실제 프로그래밍 할 때 그나마 가장 유의미한 내용일 것이라 생각한다.
값을 float 실수형을 쓰는데, 정말 정확한 값을 얻어야 한다면, 유효숫자가 6개 내의 범위의 숫자만 활용해야한다.
double의 위와 같은 정밀도는 16개의 유효숫자를 갖는다. 확실히 넓긴하다..
서로 다른 두 실수가 정말 다르다는 것을 알기 위해서는 최대9번째 유효숫자까지 확인해야한다는 말이다. 이 말은 어려울 수 있는데,
유효숫자의 n번째 자리까지 확인한다는 의미는 n+1번째 자리에서 반올림을 해서 두 실수가 같은지를 확인한다는 말이다
예를들어
1.12312321
1.12315231
이 란 두수 가 있다고 해보자
이 두수가 다른지 확인하기 위해서는 유효숫자 5번째짜리 까지 확인해야한다.
1.1231
1.1232
이기 때문이다. 이런식으로 말이다.
즉 정밀도 9의 의미는 위의 방법을 활용해서, 유효숫자 9번째짜리까지 확인하면, 두 값이 다른지 확인할 수 있다는 것을 의미한다.
이것을 실제 프로그래밍에 어떤식으로 적용할지는 아직 생각이 나지 않지만..
알아두도록 하자.
#Cf)
마지막으로, 부동 소수점으로 표현되는 실수는 근사치로 실수를 표현하기 때문에 절대 ==으로 비교하면 안됩니다. 앱실론 이라는 값을 통해 두값의 차가 앱실론보다 작으냐를 비교해서, 두 실수가 같은지 확인할 수 있습니다. 각 언어를 확인해주세요~
PocuAcademy -comp 1000
https://woo-dev.tistory.com/92