////
Search
Duplicate
🌙

Chapter 03. 컴퓨터도 계산을 잘못 할 수 있다!

01. 0.1을 100번 더해도 10이 되지 않는다?

0.1을 정확하게 저장할 수 없다. 따라서 100번 더해도 10이 되지 않고 오차가 발생한다.

02. 2진수 소수를 10진수로 변환하는 방법은?

소숫점 이하의 부분도 정수처럼 자릿수를 곱해서 그 결과를 더하면 된다.

03. 컴퓨터가 계산을 틀리게 하는 이유

2진수로 절대 표현할 수 없는 소수들은 근사값으로 표현되므로 정확한 계산이 발생하지 않는 문제가 발생한다.

04. 부동 소수점 수 표현 방법을 알아보자

많은 프로그래밍 언어들은 소수를 나타내는 데이터형으로 배정도 부동 소수점 수 및 단정도 부동 소수점 수 두 가지를 제공하고 있다.
배정도 부동 소수점형은 64비트, 단정도 부동 소수점형은 32비트로 소수 전체를 표현한다. C언어에서는 각각 double, float으로 나타난다.
이들 데이터 형에서는 소수를 부동 소수점 수로 표현하는 방법을 채택하고 있는데, 부동 소수점 수는 소수를 어떻게 표현할까?
일반적으로 부동 소수점 수에서는 소수를 부호, 가수, 기수, 지수의 4개 부분으로 나누어서 나타낸다. 컴퓨터는 2진수를 사용하므로 부호, 가수, 지수의 3개만 포함시켜 부동 소수점 수를 표현한다.
IEEE 표준에 따르면 배정도는 부호, 지수, 가수에 각각 1, 11, 52비트를 단정도는 1, 8, 23비트를 사용한다.

05. 정규 표현과 익세스 표현 마스터하기

가수에 사용되는 정규 표현은 다양한 형식으로 표현할 수 있는 부동 소수점 수를 하나로 통일해서 나타내기 위한 방법이다.
0.75를 나타내기 위해 0.751000.75 * 10^0, 7510275 * 10^{-2}와 같이 다양한 표현식이 생길 수 있다.
이런 표현 방식들을 하나로 통일한 규칙이 필요했고 소수점 첫 번째 자리는 0이 아닌 값으로 나타낸다라는 규칙을 정했다.
2진수에서는 항상 소수점 이상의 값을 1로 고정하는 정규 표현을 사용한다.
⇒ 항상 1임이 보장되므로 비트 하나를 아낄 수 있다. 배정도와 단정도는 각각 53, 24비트를 사용하고 있는 것이다.
지수에 사용되는 익세스 표현은 부호 비트를 사용하지 않고 음수를 나타내기 위한 방법이다.
지수부에서 나타날 수 있는 최대값을 반으로 나눈다. 그리고 그 값을 0으로 간주한 후 지수의 부호를 나타내기 위한 별도의 비트를 사용하지 않고 그 자체만으로 부호와 크기를 표현한다.

06. 궁금했던 단정도 부동 소수점 수 표현 방법 찜하기

실습

07. 컴퓨터의 계산 실수를 예방하는 두 가지 방법

컴퓨터가 계산을 틀리게 하는 원인 중 하나는 내부에서 소수가 부동 소수점 수로 취급되기 때문이다.
첫 번째 예방법은 실수를 무시하는 것이다.
프로그램의 목적에 따라 계산 결과의 사소한 오차가 전혀 문제가 되지 않는 경우, 무시할 수 있다.
두 번째 예방법은 소수를 정수로 변환한 후 계산하는 것이다.
정수 계산의 범위에서는 절대로 틀리지 않기 때문에 계산할 때만 일시적으로 정수를 사용한 후, 계산 결과는 소수로 변환해서 표시할 수 있다.
이 외에도 2진수를 사용해서 10진수를 표현하는 형식으로 BCD가 있다.
이는 4비트를 사용해 0~9의 숫자를 나타내는 방법이다.
계산 오차가 되지 않거나 신뢰성이 정말 중요한 프로그램의 경우, 일시적으로 정수를 사용하거나 BCD를 사용하는 방법을 통해서 정확한 값을 얻도록 해야 한다.

08. 뚱뚱한 2진수 대신 날씬한 16진수를 사용하자!

2진수는 비트 단위로 데이터를 나타내는 경우 편리하지만 숫자의 크기가 커질 경우, 길이가 너무 길어져 읽기 힘들다는 단점을 가지고 있다.
이 때문에 실제 프로그램을 만들 때는 2진수 대신 16진수가 주로 사용된다.