Top

많은 그래픽 프로그램은 실제로 3D 숫자 코드에 불과합니다. 수치적 문제는 그러한 프로그램에서 종종 중요합니다. “옛날”에는 기계가 숫자에 대한 내부 표현이 다르고 예외를 서로 호환되지 않는 방식으로 처리했기 때문에 강력하고 이식 가능한 방식으로 이러한 문제를 처리하는 것이 매우 어려웠습니다. 다행스럽게도 거의 모든 최신 컴퓨터는 IEEE 부동 소수점 표준(IEEE Standards Association, 1985)을 따릅니다. 이를 통해 프로그래머는 특정 숫자 조건이 처리되는 방법에 대해 여러 가지 편리한 가정을 할 수 있습니다. IEEE 부동 소수점에는 숫자 알고리즘을 코딩할 때 유용한 많은 기능이 있지만 그래픽에서 발생하는 대부분의 상황에서 알아야 할 중요한 기능은 몇 가지뿐입니다. 첫째, 가장 중요한 것은 IEEE 부동 소수점 실수에 대한 세 가지 “특수” 값이 있음을 이해하는 것입니다.

  1. 무한대($\infty$). 이것은 다른 모든 유효한 숫자보다 큰 유효한 숫자입니다.
  2. 음의 무한대($-\infty$). 이것은 다른 모든 유효한 숫자보다 작은 유효한 숫자입니다.
  3. Not a Number ($\text{NaN}$). 이것은 $0$을 $0$으로 나누는 것과 같이 정의되지 않은 결과가 있는 작업에서 발생하는 잘못된 숫자입니다.

IEEE 부동 소수점 설계자는 프로그래머에게 매우 편리한 몇 가지 결정을 내렸습니다. 이들 중 대부분은 $0$으로 나누기와 같은 예외를 처리할 때 위의 세 가지 특수 값과 관련이 있습니다. 이러한 경우 예외가 기록되지만 대부분의 경우 프로그래머는 이를 무시할 수 있습니다. 특히, 모든 양의 실수에 대해 무한 값으로 나누는 것과 관련된 다음 규칙이 적용됩니다. \(\begin{align} +a/(+\infty) &= +0\\ -a/(+\infty) &= -0\\ +a/(-\infty) &= -0\\ -a/(-\infty) &= +0\\ \end{align}\) 무한 값을 포함하는 다른 작업은 예상대로 작동합니다. 다시 긍정적인 경우 동작은 다음과 같습니다. \(\begin{align} \infty + \infty &= +\infty\\ \infty - \infty &= \text{NaN}\\ \infty \times \infty &= \infty\\ \infty / \infty &= \text{NaN}\\ \infty / a &= \infty\\ \infty / 0 &= \infty\\ 0 / 0 &= \text{NaN}\\ \end{align}\) 무한 값을 포함하는 부울 표현식의 규칙은 예상한 대로입니다:

  1. 모든 유한한 유효 숫자는 $+\infty$보다 작습니다.
  2. 모든 유한 유효 숫자는 $-\infty$보다 큽니다.
  3. $-\infty$는 $+\infty$보다 작습니다.

$\text{NaN}$ 값이 있는 표현식과 관련된 규칙은 간단합니다.

  1. $\text{NaN}$을 포함하는 모든 산술 표현식은 $\text{NaN}$이 됩니다.
  2. $\text{NaN}$을 포함하는 모든 부울 표현식은 거짓입니다.

IEEE 부동 소수점의 가장 유용한 측면은 아마도 $0$으로 나누기가 처리되는 방법일 것입니다. 모든 양의 실수에 대해 $0$값으로 나누는 것과 관련된 다음 규칙이 적용됩니다. \(+a/+0 = +\infty\\ -a/+0 = -\infty\\\) 프로그래머가 IEEE 규칙을 활용하면 훨씬 더 간단해지는 많은 숫자 계산이 있습니다. 예를 들어 다음 표현식을 고려하십시오. \(a = \frac{1}{\frac{1}{b} + \frac{1}{c}}\) 이러한 표현은 레지스터와 렌즈에서 발생합니다. $0$으로 나누기가 프로그램 충돌을 일으키면(IEEE 부동 소수점 이전의 많은 시스템에서 그러했듯이) $b$ 또는 $c$의 작거나 $0$ 값을 확인하기 위해 두 개의 if 문이 필요합니다. 대신 IEEE 부동 소수점을 사용하면 $b$ 또는 c가 $0$이면 원하는 대로 $0$ 값을 얻습니다. 특별한 검사를 피하기 위한 또 다른 일반적인 기술은 $\text{NaN}$의 부울 속성을 활용하는 것입니다. 다음 코드 세그먼트를 고려하십시오. \(a = f(x)\\ \text{if (a > 0) then}\\ \space \space \space \space \space \space \space \text{do something} \\\) 여기서 함수 $f$는 $\infty$ 또는 $\text{NaN}$과 같은 “못생긴” 값을 반환할 수 있지만 if 조건은 여전히 잘 정의되어 있습니다. $a = \text{NaN}$ 또는 $a = −\infty$이면 false이고 $a = +\infty$이면 true입니다. 반환되는 값을 신중하게 결정할 때 특별한 검사 없이 종종 if가 올바른 선택을 할 수 있습니다. 이것은 프로그램을 더 작고, 더 강력하고, 더 효율적으로 만듭니다.