| English | 의미 |
|---|---|
| floating-point/ˈfləʊtɪŋ pɔɪnt/ | 부동소수점 |
| mantissa/mænˈtɪsə/ | mantissa |
| exponent/ekˈspəʊnənt/ | 지수 |
| normalised/ˈnɔːməlaɪzd/ | 정규화됨 |
| precision/prɪˈsɪʒn/ | 정밀도 |
| rounding errors/ˈraʊndɪŋ ˈerəz/ | 반올림 오차 |
| fixed-point/fɪkst pɔɪnt/ | 고정소수점 |
| overflow/ˌəʊvəˈfləʊ/ | 오버플로우 |
| underflow/ˌʌndəˈfləʊ/ | underflow: 하류 |
600미터를 빗겨 날아간 미사일
- On 25 February 1991 a Patriot battery at Dhahran failed to intercept an incoming missile. Twenty-eight soldiers died.
- The system counted time in tenths of a second, and 0.1 has no exact binary representation: it is a repeating fraction, truncated to the register's width. Each tick lost a fraction of a microsecond.
- After a hundred hours running, the accumulated error was a third of a second, and in a third of a second the target moved 600 metres. The arithmetic was correct at every single step.
- 이 수업에서는 부동소수점 형식, 정규화, 그리고 이러한 현상이 가능하게 하는 근사 오차를 다룹니다.
형식
- 크기가 매우 다른 실수를 저장하기 위해 컴퓨터는 과학적 표기법의 이진 형태를 사용하며 두 개의 필드를 가집니다: 유효숫자인 **mantissa(부동소수점 수)**와 곱해야 할 2의 거듭제곱인 exponent(지수). 둘 다 **두의 보수(two's complement)**로 저장됩니다.
- 부동소수점의mantissa를 이진 fraction으로 읽으세요: 소수점 바로 뒤 첫 번째 비트는 $\tfrac12$, 다음은 $\tfrac14$, 그 다음은 $\tfrac18$에 해당. 따라서
0.1010000은 $\tfrac12 + \tfrac18 = 0.625$입니다. - 지수가
00000010일 때, 즉 $+2$일 때, 해당 값은 $0.625 \times 2^2 = 2.5$입니다.

분수와 2의 거듭제곱
부동소수점 숫자 구성하기
mantissa와 exponent 비트를 뒤집어 값을 만들고, 이것이 정격(normalised)인지 확인하십시오.
부동소수점 숫자는 다음과 같이 저장됩니다:
난이도 1/5 · 100 코인 + 오늘 첫 완료 시 소액 보너스
value = mantissa × 2^exponent — 이_Handle 과학기법으로, 두 부분 모두 2의 보수로 저장됨.
부동소수점 표현의 각 부분을 그 역할과 연결하십시오.
난이도 2/5 · 140 코인 + 오늘 첫 완료 시 소액 보너스
value = mantissa × 2^exponent; 정격화는 정밀도를 극대화합니다; 금액은 반올림을 방지하기 위해 고정소수점/BCD을 사용합니다.
worked example: 이진 수를 진법으로 변환
- 어떤 수의 mantissa가
10110000이고 지수가00000011일 때, 이 수의 진법 값을 구하십시오. - 지수는 $+3$입니다. mantissa가 1로 시작하므로 음수이며 두의 보수 규칙에 따라 읽힙니다:
1.0110000에서 부호 비트는 $-1$의 가치를 가지며 분수 비트들은 $\tfrac14 + \tfrac18 = 0.375$를 더하므로, mantissa는 $-1 + 0.375 = -0.625$입니다. - $\text{number} = -0.625 \times 2^3 = -5.0$.
- 가장 흔한 실수는 음수의 유효숫자를 양수로 잘못 읽는 것입니다. 먼저 부호 비트를 반드시 확인하십시오.
부동소수점 숫자가 mantissa 10110000와 exponent 00000011를 가질 때, 진수(deenary) 값은 무엇입니까?
난이도 1/5 · 100 코인 + 오늘 첫 완료 시 소액 보너스
mantissa가 1로 시작하므로 음수입니다: −1 + 1/4 + 1/8 = −0.625. 이를 2^3에 곱하면 −5.0이 됩니다. 양수로 읽는 것이 일반적인 오류입니다.
worked example: 십진수에서 이_Handle로 변환
- $+2.5$을 동일한 8비트 유효숫자, 8비트 지수부 형식으로 저장합니다.
- 이진수에서 $2.5 = 10.1$입니다. 2의 거듭제곱을 한 분수로 표기하면: $2.5 = 0.101 \times 2^2$입니다.
- So the mantissa is
01010000, a sign bit of 0 then.101padded with zeros, and the exponent is00000010. - 항상 정형화(normalised)된 형태로 먼저 작성한 후, 두 필드를 그대로 읽어내십시오.
정격 분수를 2의 거듭제곱에 곱한 형태로 쓰면 2.5 = 0.101 x 2^__ 입니다. 지수를 구하십시오.
난이도 1/5 · 100 코인 + 오늘 첫 완료 시 소액 보너스
2.5는 이_Handle로 10.1입니다; 소수점을 두 자리 왼쪽으로 이동하면 0.101이 되므로, 지수는 2이고 mantissa는 01010000입니다.
정규화
- 수는 유효숫자의 첫 번째 비트가 이진 소수점 바로 뒤에 위치할 때 **정규화(normalised)**되었다고 합니다. 이는 앞선 불필요한 영점(leading zeros)이 없음을 의미합니다. 양수인 경우 mantissa는
0.1로 시작하고, 음수인 경우1.0로 시작합니다. - 이유: 이는 정밀도를 극대화합니다. 각 유효숫자 비트가 정보(앞선 0이 아닌)를 담당하기 때문입니다.
- 정형화하기 위해 유효숫자를 왼쪽으로 이동하고 지수부를 같은 개수만큼 줄이거나, 오른쪽으로 이동하고 늘립니다. 값은 변하지 않으며, 오직 표현 방식만 바뀝니다.

비트 이동, 지수부 조정, 값 유지
유효숫자 비트와 지수부 비트 간의交換
- 총 비트 수는 고정되어 있으므로 두 필드는 서로 경쟁합니다.
- 유효숫자 비트가 많을수록 정밀도가 높아집니다: 각 값이 더 정확히 저장되어 절사 오류가 작아집니다.
- 지수부 비트가 많을수록 범위가 넓어집니다: 훨씬 크거나 작은 크기의 값을 표현할 수 있지만, 각 값은 더 정밀하지 않게 표현됩니다.
- 한 필드의 비트를 다른 필드로 옮기는 것이 효과인지 묻는 질문은 이러한 범위를 위한 정밀도의交換을 정확히 요구합니다.
부동소수점 숫자의 정격화
정규화를 단계별로 진행합니다. 유효숫자의 앞쪽 소모된 영을 제거하고 지수를 그에 맞춰 조정하면 값은 동일하게 유지되지만 모든 비트를 정밀도에 할당합니다.
부동소수점 숫자의 정격화:
난이도 1/5 · 100 코인 + 오늘 첫 완료 시 소액 보너스
정격화는 mantissa를 이동시켜 첫 번째 유효 비트가 소수점 바로 뒤에 오도록 하며, 이때 모든 비트가 정보를 담고 값은 변하지 않습니다.
부동소수점 숫자의 정격화에 대해 참인 것을 모두 선택하십시오.
난이도 2/5 · 140 코인 + 오늘 첫 완료 시 소액 보너스
정격화는 표현만 변경할 뿐입니다. 값은 변하지 않으며, 이는 exponent를 조정함으로써 보장됩니다.
근사값과 그 결과
- 많은 진법 실수들은 이진수에서 정확히 저장될 수 없습니다. $0.1$는 무한 소수 $0.000110011\ldots$이므로 잘려야 하며: 저장된 값은 $0.1$과 유사하지만 결코 같지 않습니다.
- 반올림 오차는 여러 연산을 거치면서 축적되는데, 이것이
0.1 + 0.2가 정확히0.3이 아닌 이유이자 Patriot 미사일의 시계가 drift(편차)를 일으킨 이유입니다. - So never test two reals for equality: write
ABS(x - 0.3) < 1e-9instead ofx = 0.3. And beware subtracting two nearly equal values, which throws away most of the significant digits. - 정확성이 필수적인 값, 특히 화폐 금액에는 고정소수점(fixed-point) 또는 BCD를 사용하십시오.
비트 할당 변화가 미치는 영향을 각각 연결하십시오.
난이도 2/5 · 140 코인 + 오늘 첫 완료 시 소액 보너스
워드 크기는 고정되어 있으므로 정밀도와 범위는 상충关系에 있으며, 오버플로우와 언더플로우는 양 끝에서 지수 필드가 고갈될 때 발생합니다.
오버플로우와 언더플로우
- 오버플로우(overflow) 는 결과가 지수부의 범위를 너무 크게 넘어 representing할 수 없을 때 발생합니다.
- 언더플로우(underflow) 는 결과가 너무 작아 제로에 너무 가까워 지수부가 더 낮아질 수 없어 제로로 반올림될 때 발생합니다.
- 둘 다 위交换의另一半인 지수부 필드의 크기의 속성입니다.
이_Handle로 0.1을 정확히 저장할 수 없습니다(반복 분수이기 때문), 따라서 컴퓨터상에서 0.1 + 0.2는 정확히 0.3이 되지 않습니다.
난이도 1/5 · 100 코인 + 오늘 첫 완료 시 소액 보너스
미미한 근사 오차가 누적됩니다—그것이 바로 금액 처리 시 부동소수점이 아닌 고정소수점 또는 BCD을 사용하는 이유입니다.
정확한 금액 계산에는 다음을 사용해야 합니다:
난이도 1/5 · 100 코인 + 오늘 첫 완료 시 소액 보너스
통화 처리에 부동소수점 반올림 오류는 허용될 수 없으며, 고정소수점 또는 BCD는 소수점을 정확히 저장합니다.
놓칠 수 있는 점
- The mantissa is a fraction, not an integer: the first bit after the point is a half.
- 1로 시작하는 유효숫자는 음수이며 2의 보수 규칙을 따릅니다. 먼저 해당 비트를 확인하십시오.
- 정형화는 정밀도를 극대화하며, 값 자체를 바꾸거나 숫자를 크게 만들지는 않습니다.
- 유효숫자가 많으면 정밀도, 지수부가 많으면 범위입니다. 오버플러우는 너무 큼, 언더플로우는 너무 작음입니다.
이해했습니다
- 부동소수점은 2의 보수로 storing되는 $\text{mantissa} \times 2^{\text{exponent}}$을 포함하며, 유효숫자는 이_Handle 분수입니다.
- 유효숫자를 분수로 reading(2의 보수 if starts with 1)하고 지수부에 해당하는 2의 거듭제곱으로 곱하여 convert합니다.
- 정형化은 첫 유효숫자 비트가 점 바로 다음에 있어 정밀도를 극대화함을 의미하며, 왼쪽으로 이동하면 지수부가 낮아집니다.
- 유효숫자 비트가 많으면 정밀도, 지수부 비트가 많으면 범위; 이_Handle는 많은 실수를 정확히 store할 수 없으므로 절사 오류를 예상하고, 허용 오차(tolerance)로 비교하며, 화폐에는 고정소수점이나 BCD를 사용하십시오.