# 트렁케이션 오차(Truncation Error)와 라운딩 오차(Rounding Error)

#### 개념적 구분

수치해석에서 다루는 여러 종류의 오차 중 트렁케이션 오차와 라운딩 오차는 서로 다른 원인에서 비롯된다. 트렁케이션 오차는 근사 공식을 도입하거나 유한 합으로 절단하여 발생하는 근본적 오차이며, 라운딩 오차는 컴퓨터가 실수를 내부적으로 표현할 때 생기는 부정확성에서 기인한다. 두 오차 유형이 겹쳐서 문제의 전체 오차를 구성하므로, 이를 명확히 이해하고 적절히 제어하는 것은 수치 알고리즘 설계와 분석의 핵심 주제 중 하나이다.

#### 트렁케이션 오차(Truncation Error)

트렁케이션 오차는 무한 급수나 연속적 개념을 유한 개로 끊어내면서 필연적으로 발생한다. 대표적으로 테일러 전개를 예로 들면, 어떤 함수 $f(x)$를 기준점 $x\_0$ 주위에서 테일러 급수로 전개했을 때 무한 급수를 모두 쓰지 않고 특정 차수까지만 사용하면 고차 항들을 잘라내게 된다. 이 잘라낸 부분에서 오는 차이가 트렁케이션 오차가 된다. 예를 들어,

$$
f(x) = f(x\_0) + f'(x\_0)(x - x\_0) + \frac{f''(x\_0)}{2!}(x - x\_0)^2 + \cdots + \frac{f^{(n)}(x\_0)}{n!}(x - x\_0)^n + \cdots
$$

여기에서 $n$차 항까지 포함한 근사식을

$$
P\_n(x) = \sum\_{k=0}^{n} \frac{f^{(k)}(x\_0)}{k!} (x - x\_0)^k
$$

로 두면, 실제 값 $f(x)$와의 차이는 뒤이어 등장하는 $n+1$차 이상의 고차 항들을 생략한 부분에서 발생한다. 이 차이를 트렁케이션 오차라고 한다.

트렁케이션 오차는 해석적으로 상계(bound)를 구할 수 있는 경우가 많다. 예를 들어 테일러 급수의 나머지항(Remainder Term)을 사용하여 오차를 추정할 수 있다. 이러한 오차 추정이 가능한 이유는 근사 과정 자체가 이론적으로 명확하게 정립되어 있고, 잘라낸 항들의 형태가 일반적으로 수렴을 보장하는 구조를 가진 급수이기 때문이다.

수치해석에서 자주 등장하는 예는 미분 방정식을 풀 때 사용하는 유한차분 근사(예: $f'(x) \approx \[f(x+h) - f(x)] / h$)이다. 여기에서도 $h$가 무한소로 가야만 정확한 값이 되지만, 실제로는 $h$를 유한하게 택하므로 고차 항이 생략되고, 그 결과 트렁케이션 오차가 발생한다.

#### 라운딩 오차(Rounding Error)

라운딩 오차는 컴퓨터가 이산적이고 제한된 비트 수로 유리수 혹은 실수를 저장·연산하기 때문에 발생한다. 현대의 대부분 컴퓨터 시스템에서 플로팅 포인트(floating-point) 형식으로 수를 표현하는데, 이는 유효 자릿수가 제한되어 있기 때문에 실제 실수 값과 내부적으로 표현되는 값 사이에 차이가 불가피하다. 플로팅 포인트 표준(예: IEEE 754)을 따르면, 어떤 수 $x$는 유효 자릿수(또는 가수부 mantissa)의 크기에 따라 가장 인접한 어떤 $\tilde{x}$로 반올림되거나 잘려서 표현된다.

라운딩 오차의 대표적 예는 매우 큰 수와 작은 수를 더하거나 빼는 연산에서 발생하는 유효 자릿수 손실(cancellation) 문제이다. 예를 들어, 매우 큰 수 $M$과 매우 작은 수 $\delta$를 더하는 경우, 실제 연산 결과 $M + \delta$가 유효 자릿수 한계 때문에 $M$으로만 표현될 수 있다. 이는 상대적으로 작은 수가 반올림으로 소멸되는 결과를 낳는다. 이처럼 대수적 구조와 연산 순서에 따라 라운딩 오차가 누적되는 정도가 크게 달라질 수 있기 때문에, 수치 안정성(numerical stability)을 고려해야 한다.

라운딩 오차는 단순히 한 번의 반올림에서 끝나는 것이 아니라, 여러 번의 연산이 누적됨에 따라 종종 예측하지 못한 크기의 오차로 부풀어 오를 수 있다. 따라서 알고리즘적으로 라운딩 오차가 잘 제어되는지, 즉 안정적인 알고리즘인지가 매우 중요하다. 안정적인 알고리즘은 연산 순서나 방식이 조금 달라져도 전체 오차가 통제 가능한 범위 내에서 유지되도록 설계된다.

#### 트렁케이션 오차와 라운딩 오차의 상호작용

복합적인 수치 해석 알고리즘에서 트렁케이션 오차와 라운딩 오차는 상호 영향을 주고받는다. 예를 들어, 적분 문제에서 구간을 세분화하면서 더 작은 $h$를 사용하면 트렁케이션 오차가 줄어드는 반면, 더 많은 반복 연산이 수행되어 라운딩 오차가 커질 수 있다. 따라서 두 오차를 함께 고려하여 최적의 균형점을 찾는 것이 매우 중요한 주제가 된다.

아래는 오차가 누적되는 과정을 단순화하여 표현한 흐름도 예시이다.

{% @mermaid/diagram content="flowchart LR
A\[정확한<br/>이론값] --> B\["근사화<br/>(트렁케이션<br/>오차 발생)"]
B --> C\["컴퓨터<br/>플로팅 포인트<br/>표현(라운딩<br/>오차 발생)"]
C --> D\[결과]" %}

이런 상호작용과 누적 효과 때문에, 실제 구현 단계에서 오차를 제어하고 진단하는 일이 수치해석 알고리즘 개발에 필수적이다.

#### 트렁케이션 오차의 분석적 도구

트렁케이션 오차는 대개 문제 설정과 수학적 모델링의 정확도에서 결정된다. 예를 들어 차분 근사로 1차 미분을 구한다면, 오차항은 일반적으로 $O(h)$ 또는 $O(h^2)$ 형태를 갖는다. 어떤 차분 공식을 쓰느냐에 따라 오차항이 달라지며, 오차항의 차수(order)가 높을수록 주어진 $h$에 대해 오차가 더 작아진다.

구체적으로 전진 오차(Forward Difference) 근사는

$$
f'(x) \approx \frac{f(x + h) - f(x)}{h}
$$

를 사용한다. 테일러 전개를 이용하면, 실제 $f'(x)$와 이 근사의 차이가 $O(h)$임을 보일 수 있다. 이는 $h$가 작아질 때 오차가 선형으로 줄어든다는 뜻이다. 후진 오차(Backward Difference), 중심 오차(Central Difference) 등 다양한 공식마다 상이한 오차 분석을 적용할 수 있다. 이는 트렁케이션 오차의 대표적 양상이다.

#### 라운딩 오차의 부각과 크기 추정

플로팅 포인트 연산에서 라운딩은 해당 기수(2진, 10진 등)에 따라 “가장 근사한 표현”을 선택하는 식으로 이루어진다. 예를 들어 IEEE 754 2진 부동소수점에서는 어떤 유한 자릿수 $t$가 주어졌을 때, 실제 실수 $x$는 다음과 같은 형태의 $\tilde{x}$로 반올림될 수 있다.

$$
\tilde{x} = \pm (1.b\_1 b\_2 \dots b\_m)\_2 \times 2^e
$$

여기에서 $(1.b\_1 b\_2 \dots b\_m)\_2$는 가수부의 길이가 $m$로 제한된 2진수 형태로 저장되고, 지수부 $e$ 역시 유한한 크기를 가진다. 반올림 규칙(Round to nearest, Round toward zero 등)에 따라 실제 $x$와 $\tilde{x}$ 사이에 오차가 발생하며, 이를 머신 이쁠실론(machine epsilon)과 같은 개념으로 평가할 수 있다. 머신 이쁠실론은 플로팅 포인트 체계에서 “1과 1보다 큰 가장 작은 표현 가능한 수”의 차이를 나타내며, 일반적으로 이 값으로부터 시스템이 표현할 수 있는 상대적 정밀도를 추정한다.

라운딩 오차는 흔히 $O(\epsilon\_m)$으로 표현되며, $\epsilon\_m$은 머신 이쁠실론 크기에 비례한다. 하지만 여러 연산 과정에서 오차가 누적될 수 있으므로, 실제로는 오차 추적과 재구축 과정이 훨씬 복잡해진다. 예를 들어, 뺄셈 과정에서 앞자리들이 상쇄되는 cancellation error가 발생하면, 상대적으로 극단적인 오차가 도드라져서 나타날 수 있다.

#### 수치 안정성(Numerical Stability)과 알고리즘의 설계

수치 알고리즘을 설계할 때는 트렁케이션 오차와 라운딩 오차를 동시에 고려해야 한다. 어떤 방법이 이론적으로는 높은 차수의 트렁케이션 오차를 갖더라도, 실제 계산에서 라운딩 오차가 크게 누적되어 최종적으로는 정확도가 떨어질 수 있다. 이를 방지하기 위해서는 알고리즘의 수치 안정성을 분석해야 한다. 수치 안정성은 작은 입력값 변화나 중간 계산과정의 라운딩이 최종 결과에 얼마나 민감하게 반영되는지, 즉 알고리즘이 오차에 대해 얼마나 견고한지를 측정한다.

수치 안정성이 높은 알고리즘은 중간 연산 과정에서 라운딩 오차가 조금씩 생기더라도 결과에 큰 영향을 주지 않는다. 반면, 불안정한 알고리즘은 중간 과정에서 발생한 작은 오차라도 기하급수적으로 증폭시켜 최종 결과를 심각하게 왜곡할 수 있다. 이에 대한 전형적 예는 조건수(condition number)가 매우 큰 문제(예: 서로 매우 가까운 두 수의 차를 구하는 문제 등)에 대한 직접 계산이다. 만약 문제 자체가 ill-conditioned(조건수가 매우 큼)하다면, 어떤 방법을 써도 오차가 커지기 쉬우며, 방법론에 따라 그 정도가 달라진다.

#### 조건수(Condition Number)와 오차 증폭

문제가 ill-conditioned 상태인지, well-conditioned 상태인지 진단하기 위해서는 조건수를 사용한다. 예를 들어 스칼라 함수 $f(x)$에 대해, 상대오차 개념으로 조건수를 정의할 수 있다. 입력 $x$가 작은 변화 $\delta x$를 가질 때 결과가 얼마나 민감하게 변하는지 측정하는 계수로서, 일반적으로 다음과 같은 형태로 표현한다.

$$
\kappa(x) = \left|\frac{x f'(x)}{f(x)}\right|
$$

이 값이 매우 크면, $x$에서 조금만 변화가 생겨도 $f(x)$의 값이 크게 변함을 의미한다. 벡터나 행렬로 확장한 경우, 행렬 $\mathbf{A}$의 조건수를 $\mathbf{A}$의 노름에 기초해 정의한다. 예컨대 2-노름을 사용할 경우,

$$
\kappa\_2(\mathbf{A}) = |\mathbf{A}|\_2 |\mathbf{A}^{-1}|\_2
$$

으로 정의된다. 이 조건수가 클수록 라운딩 오차나 입력값 근사에 의해 결과가 크게 변동될 가능성이 높다. 따라서 알고리즘 자체의 안정성을 아무리 높여도, 문제의 조건수가 나쁘면 결국 정확도를 담보하기 어려운 상황이 벌어진다.

#### 예시: 단순 수열 합 계산과 오차 누적

라운딩 오차가 누적되는 단순한 사례로, 커다란 수와 매우 작은 수를 순차적으로 더하는 과정에서 발생하는 현상을 살펴볼 수 있다. 예컨대 임의의 작은 실수들을 큰 수에 더할 때, 많은 항들이 반올림으로 인해 무시되거나 소멸되는 일이 발생한다. 여기서 더하는 순서를 바꾼다고 해서 이론적으로는 합이 같아야 하지만, 컴퓨터에서 유효 자릿수 제한이 있기 때문에 순서에 따라 최종 합이 달라질 수 있다.

아래는 파이썬(Python) 환경에서 랜덤한 실수를 서로 다른 순서로 합산하여 그 차이를 확인하는 코드 예시이다.

```python
import numpy as np

# 무작위로 작은 수들을 생성
np.random.seed(0)
vals = np.random.rand(100000) * 1e-8

# 큰 상수
big_val = 1e8

# 1. 큰 수부터 더하기
sum_first_big = big_val
for v in vals:
    sum_first_big += v

# 2. 작은 수들을 모두 더한 뒤에 큰 수를 더하기
sum_after_sum = np.sum(vals) + big_val

# 출력
print("큰 수부터 순차적으로 더한 결과:", sum_first_big)
print("작은 수를 먼저 더한 결과      :", sum_after_sum)
print("두 결과의 차이                 :", sum_first_big - sum_after_sum)
```

이 코드를 실행해 보면 두 결과가 동일하지 않을 수 있음을 확인하게 된다. 이는 라운딩 오차가 누적되고 분포되는 방식이 다르기 때문에 생기는 현상이다. 실제로 더하는 순서가 달라짐에 따라 반올림이 일어나는 시점이 달라지고, 결과적으로 합산 결과가 상이해진다. 이와 같은 문제는 특히 유의미한 자릿수를 많이 소모하는 큰 연산 과정에서 더욱 부각된다.

#### 실험적 오차 평가와 실무적 처리

수치 해석 문제를 실무적으로 다룰 때는 오차 발생 양상을 직접 관찰하고 이에 따른 보정이나 방법 수정 절차를 마련해야 한다. 대표적으로 안정적인 알고리즘을 선택하고, 가능하면 ill-conditioned 문제를 회피하거나 조건을 개선하는 전처리를 수행하는 식이다. 일부 문제는 적절한 변수 변환, 스케일링(scaling), 정규화(normalization) 등을 통해 조건수를 낮출 수도 있다.

트렁케이션 오차를 줄이기 위해서는 일반적으로 고차 근사를 사용하거나, 세분화된 간격(예: 미분 방정식에서 $h$를 작게 설정) 등을 적용한다. 그러나 $h$가 지나치게 작으면 연산 횟수가 늘어나 라운딩 오차가 커질 수 있음에 유의해야 한다. 이 둘 사이의 균형점은 이론적 분석 및 수치 실험을 통해 결정하는 것이 일반적이다.

#### Kahan Summation 기법과 보상(補償) 연산

라운딩 오차의 누적을 줄이기 위해 고안된 방법 중 하나는 Kahan Summation 알고리즘이다. 이는 덧셈 연산 중 발생하는 작은 오차를 별도의 변수에 축적하여, 후속 연산에서 이를 보상(또는 상쇄)하는 방식으로 동작한다. 예컨대 매우 작은 값 $\delta$를 큰 값 $S$에 더할 때 그 차이가 반올림으로 인해 무시되지 않도록, 작은 값을 보관하는 누적 변수를 별도로 두고 다음 덧셈에서 이를 고려한다. 이렇게 하면 단순 합산보다 훨씬 높은 정확도를 얻을 수 있다.

이 알고리즘은 다음과 같은 핵심 아이디어를 갖는다. 우선 $S$에 $\delta$를 더할 때 생기는 $\mathrm{round}(S + \delta) - S - \delta$ 형태의 오차가 실제로는 매우 작은 수이지만, 컴퓨터의 유효 자릿수 한계로 인해 표현할 수 없어 소멸되거나 잘못 반올림될 수 있다. Kahan Summation은 이 작은 수를 별도의 변수에 저장해 놓았다가 다음 번에 다시 활용하므로, 유효 자릿수 손실을 최대한 방지하는 효과가 있다.

예를 들어 파이썬 코드를 통해 Kahan Summation을 구현하면 다음과 비슷한 형태가 될 수 있다.

```python
def kahan_sum(values):
    s = 0.0
    c = 0.0
    for v in values:
        y = v - c
        t = s + y
        c = (t - s) - y
        s = t
    return s
```

여기에서 변수 `c`는 이전 덧셈에서 발생한 작은 보상 항을 추적한다. `y = v - c`를 통해 다음에 더할 값에 보정치를 미리 반영하고, 그 결과를 `t = s + y`로 더한 뒤에, 다시 `(t - s) - y`라는 연산을 통해 새롭게 발생하는 반올림 오차를 `c`에 저장한다. 이를 통해 유효 자릿수에서 사라질 만큼 작은 차이가 완전히 무시되지 않도록 유지한다.

#### Horner 방식의 다항식 계산

라운딩 오차를 최대한 줄이고 불필요한 곱셈과 덧셈을 피하기 위한 대표적 기법으로, 다항식(polynomial)을 평가할 때의 Horner 방식(Horner’s method)이 있다. 다항식

$$
p(x) = a\_n x^n + a\_{n-1} x^{n-1} + \cdots + a\_1 x + a\_0
$$

을 직접 계산하면, $x^k$를 매번 새로 제곱 곱셈으로 구해야 하고 그 과정에서 상당한 라운딩 오차가 누적될 수 있다. 또 여러 번의 곱셈과 덧셈이 순차적으로 일어나므로, 중간 과정에서 유효 자릿수 손실이 발생한다. 이를 Horner 방식으로 재구성하면,

$$
p(x) = a\_0 + x\bigl(a\_1 + x\bigl(a\_2 + \cdots + x(a\_{n-1} + x,a\_n)\bigr)\bigr)
$$

형태로 단순화된다. 이는

$$
p(x) = a\_0 + x \bigl( a\_1 + x \bigl( a\_2 + \cdots + x(a\_{n-1} + x,a\_n) \bigr) \bigr)
$$

와 같이 괄호를 효율적으로 배치하여, 각 단계를 $p\_i = (p\_{i-1} + a\_i) \cdot x$ 비슷한 형태로 반복 계산한다. 이렇게 하면 연산 횟수가 크게 줄고, 중간 결과의 크기도 제어되어 비교적 라운딩 오차가 작아진다. 특히 큰 $n$에 대해 다항식을 여러 번 평가해야 하는 상황에서는 Horner 방식이 필수적으로 적용되는 경우가 많다.

#### Backward Error Analysis

수치해석에서 알고리즘의 오차를 체계적으로 분석하기 위해 자주 사용하는 기법 중 하나가 Backward Error Analysis이다. 이 기법은 “알고리즘 결과가 정확한 어떤 근사 문제를 푼 것과 동등하다”고 해석한다. 예를 들어, 실제로는 라운딩과 트렁케이션 때문에 미세한 오차가 축적되어 있지만, 이것을 “입력에 미세한 변화가 있었다고 가정하면 완전히 정확한 해를 구하는 것”이라고 보는 관점이다. 이 관점을 사용하면 알고리즘의 안정성을 평가하기가 훨씬 용이해진다.

행렬 계산으로 예를 들면, 어떤 분해 알고리즘이 $\mathbf{A}$의 해를 구할 때, 실제로는 $\mathbf{A} + \Delta\mathbf{A}$에 대해 정확한 해를 구했다는 형태로 해석함으로써 $\Delta\mathbf{A}$의 크기를 제한하는 조건을 찾으면, 그 알고리즘이 안정적인지(즉 $\Delta\mathbf{A}$가 충분히 작게 유지되는지)를 판단할 수 있다. 이렇게 하면 알고리즘이 실제로 어떤 오차 분포를 가지는지, 결과가 문제의 조건수에 의해 얼마만큼 영향을 받는지 등을 체계적으로 계산할 수 있다.

#### 확장 정밀도(Extended Precision)와 다중 정밀도(Multi-Precision) 연산

라운딩 오차를 줄이는 단순하고 직접적인 방법 중 하나는 좀 더 많은 비트를 사용하여 부동소수점 수를 표현하는 것이다. 일반적인 double precision(배정밀도)보다 더 높은 정밀도를 갖는 quadruple precision(4배 정밀도) 또는 임의 정밀도(arbitrary precision) 라이브러리를 쓰는 식이다. 임의 정밀도를 사용하면, 연산 시간이 늘어나는 대가로 이론적으로 원하는 만큼 정밀도를 높일 수 있다. 그러나 실제 응용에서는 계산 시간과 메모리 사용량이 극적으로 증가하므로, 보편적으로 쓰이기에는 제약이 있다.

많은 현대 수치 계산 소프트웨어들은 내부적으로 다중 정밀도 연산 모듈을 제공하기도 한다. 예컨대 파이썬의 `decimal` 혹은 `fractions` 모듈, 혹은 C++의 GMP/MPFR 라이브러리 등이 이러한 기능을 한다. 이를 통해 표준 double precision으로 계산할 때 발생하는 큰 라운딩 오차를 완화할 수 있다. 다만, 문제의 크기가 커질수록 연산 비용이 가파르게 증가하는 점을 유의해야 한다.

#### Denormal Number와 서브노멀(subnormal) 상태

IEEE 754 표준에서는 매우 작은 수를 표현하기 위해 정상화(normalized)된 표현이 불가능할 때 서브노멀(subnormal) 또는 denormal number라는 방식을 사용한다. 이는 지수부가 표현 가능한 최솟값보다 더 작아진 값을 다룰 수 있게 해 준다. 서브노멀 영역에서는 정밀도가 더 떨어지거나, 특정 하드웨어나 라이브러리에서 성능이 저하될 수 있다. 하지만 이 표준 덕분에 부동소수점 언더플로우(underflow)가 발생하기 전에 좀 더 부드럽게 0으로 가까워지도록 수를 표현할 수 있다. 이를 통해 연산 결과가 급작스럽게 0이 되지 않고, 라운딩 오차의 형태가 비교적 완만하게 바뀐다.

서브노멀 상태가 자주 등장할 정도로 값이 매우 작은 문제는, 본질적으로 스케일링이 큰 문제 혹은 ill-conditioned 상태에 놓여 있을 가능성이 크다. 따라서 단순히 서브노멀 수 처리만으로 해결이 안 될 때는 문제의 재구성(변수 변환, 정규화, 스케일링 등)을 고려해야 한다.

#### 수치 오차와 분산(variance) 분석

통계적 관점에서 수치 오차에 대한 분산이나 평균 제곱 오차 같은 측면을 분석하기도 한다. 예를 들어, 반복 알고리즘에서 각 단계의 라운딩 오차를 확률적 변수로 취급하고, 전체 프로세스를 확률 모델로 이해하는 방식이다. 이 방식은 주로 몬테카를로(Monte Carlo) 시뮬레이션이나 랜덤화된 알고리즘에서 많이 사용된다. 전통적인 해석적 관점과 조합하여, 실제 구현에서 발생하는 누적 오차의 분포나 통계적 특성을 파악하는 데 도움이 된다.

#### 확장 방향

트렁케이션 오차와 라운딩 오차는 수치해석 전반을 관통하는 핵심 주제다. 트렁케이션 오차는 근사 과정에서 일어나는 본질적 오차이므로, 문제 설정과 근사 차수를 조절하는 방식으로 제어하며, 라운딩 오차는 컴퓨터의 유한 정밀도 표기로 인해 발생하는 한계를 인지하고, 이를 최소화하는 안정적 알고리즘을 선택하거나 보상 연산을 적용함으로써 완화한다. 문제 자체가 ill-conditioned 상태라면, 조건수를 낮추는 전처리 기법 혹은 고정밀도 연산이 선택지에 포함될 수 있다. 이 모든 과정에서 요구되는 것은 문제 자체와 알고리즘, 그리고 컴퓨터 아키텍처의 특성을 종합적으로 고려하는 사고방식이다.

#### Loss of Significance(유효자리 소실)과 Cancellation

라운딩 오차와 밀접하게 관련된 개념으로 유효자리 소실(Loss of Significance), 일명 Cancellation Error가 있다. 이는 비슷한 크기를 가진 두 수를 빼거나, 매우 큰 수와 작은 수를 더하는 과정에서 앞자리 숫자가 상쇄되어 반올림 오차가 상대적으로 크게 드러나는 현상을 일컫는다. 예를 들어,

$$
S = 123456.789012345 - 123456.789012344
$$

를 이상적으로 계산하면 $S = 0.000000001$ 정도가 되어야 하지만, 컴퓨터에서 반올림으로 인해 유효 자릿수 이상의 미세한 차이가 잘려나가면 결과가 0으로 표현되거나, 본래 값에서 크게 벗어난 값으로 나올 수 있다.

유효자리 소실을 분석하기 위해서는 연산 순서를 조정하거나, 중간에 적절한 재배열(예: factorization, 변수 변환 등)을 하여 빼기 연산에서 가까운 값들이 직접 맞부딪히지 않도록 하는 것이 중요하다. 이런 기법들은 뺄셈 외에도 다양한 연산 상황에서 적용될 수 있으며, 알고리즘 설계의 세부 단계에서 빈번히 고려된다.

#### 예시: 근사 공식에서의 취소 오차

뉴턴-라이프슨(Newton-Raphson)법이나 고차 차분공식 같은 근사 공식에서, 서로 유사한 수들의 차를 계산하는 과정이 자주 발생한다. 예를 들어, 어떤 함수 $f(x)$를 미세한 차분 $h$로 근사했을 때,

$$
\frac{f(x+h) - f(x)}{h}
$$

의 분자가 매우 작은 값이 될 수 있다. 이때 $f(x+h)$와 $f(x)$가 매우 근접하면, 소수점 아래로 길게 이어지는 자릿수가 비슷해지고, 컴퓨터 표현상으로 중요한 많은 자릿수가 상쇄되어 버릴 위험이 있다. 따라서 $h$를 조절하거나, 더 안정적인 차분 공식(예: 중심 차분)을 사용해 오차를 완화한다.

또한, 테일러 전개를 적용해 보면 $f(x+h)$가 $f(x)$에 가까운 값으로 확장되는 과정에서, $f(x)$와 $f(x+h)$의 차이가 $h$에 비례하여 작아지며, 상대적 오차가 커질 수 있음을 알 수 있다. 이런 취소 상황이 누적되면 결과적으로 라운딩 오차가 강조된다.

#### 교정(교차) 방법(Correction Method)과 Richardson Extrapolation

트렁케이션 오차를 체계적으로 줄이는 대표적 테크닉 중에는 Richardson Extrapolation이 있다. 이는 서로 다른 분할 간격(예: $h$와 $h/2$)에서 계산된 근사값을 결합하여, 고차 항을 소거함으로써 더 높은 정밀도의 결과를 얻는 기법이다. 그러나 이 방법을 시행하는 과정에서도, 근사값들이 서로 가까워 취소가 발생하기 쉬운 경우(특히 높은 차수에서)에는 라운딩 오차가 두드러질 수 있다. 적절한 안전장치와 안정성 분석이 필요하다.

리처드슨 외삽에서 대표적으로 볼 수 있는 예는 다음과 같은 형태로 나뉜다. 어떤 적분 $I$에 대한 근사값을 $I(h)$라 할 때, $I(\frac{h}{2})$와 $I(h)$를 적절히 결합해 고차 항을 제거한다. 일반적으로,

$$
\begin{align}
I(\tfrac{h}{2}) = I + \alpha h^p + \cdots
\\
I(h) = I + \alpha (2h)^p + \cdots
\end{align}
$$

형태로 $h^p$ 항이 존재할 때 이를 소거하려면,

$$
I\_{\text{ext}} = I(\tfrac{h}{2}) + \frac{I(\tfrac{h}{2}) - I(h)}{2^p - 1}
$$

등의 방식으로 결합한다. 여기서 $I\_{\text{ext}}$는 더 높은 정확도를 갖는 추정값이 되지만, $I(h)$와 $I(\frac{h}{2})$가 유사한 값을 가질 경우, 뺄셈 과정에서 유효자리 소실이 발생할 수 있으므로 정밀도 확보 측면에서 주의가 필요하다.

#### 혼합정밀도(Hybrid Precision) 기법과 복합 사용

실무에서는 정밀도가 가장 높은 형식을 전체 연산에 적용하기보다는, 주요 취소가 발생하는 국소 영역에서만 높은 정밀도를 사용하고, 나머지 연산은 일반 배정밀도(double precision)를 사용하는 방법을 택하기도 한다. 이 방식을 혼합정밀도(Hybrid Precision) 또는 복합정밀도라고 부른다.

예를 들어 커다란 선형계 $\mathbf{A}\mathbf{x} = \mathbf{b}$를 풀 때, 초기 추정값을 얻고, 그 다음 잔차(residual) 계산처럼 오류가 크게 누적될 가능성이 높은 부분에 한해서 고정밀도 연산을 수행한다. 이는 연산 코스트와 메모리 사용량을 낮추면서도, 전체 알고리즘 오차를 크게 완화할 수 있는 실용적 접근이다.

#### 고차법(High-Order Method) vs. 수치 안정성

트렁케이션 오차를 줄이기 위해 차수를 높이는 기법(고차법)을 적용할 때, 동시에 라운딩 오차가 증가하여 오히려 결과 정확도가 떨어지는 역설적 상황이 있을 수 있다. 대표적으로 고차 다항 근사나 매우 섬세한 세분화를 수반하는 수치적분에서, 수렴 속도를 높이고자 차수를 올렸지만, 계산량이 크게 늘어나며 라운딩 오차가 예기치 않게 증폭되는 경우가 있다.

실제로는 알고리즘적 최적화와 오류 분석(오차 전파 측면)을 병행하여, $h$의 감소(세분화)와 연산 횟수 증가에 따른 라운딩 오차를 저울질하면서 적절한 중간값을 찾는다. 일반적으로 중간 차수나 적절히 작은 $h$ 수준에서 최적의 타협점이 형성된다. 이를 분석하기 위해서 “지배항(dominant term)”이 트렁케이션 오차인지, 라운딩 오차인지, 아니면 문제의 ill-conditioning인지, 더 정밀한 기법이 필요한지 등을 다각도로 살핀다.

#### 잔차 해석(Residual Analysis)과 오차 전파(Error Propagation)

선형계 풀이나 비선형 방정식 반복 해법 등에서 오차 전파 과정을 잔차(residual) 해석으로 추적하기도 한다. $\mathbf{A}\mathbf{x} = \mathbf{b}$ 문제에서, 실제 연산으로 구한 해 $\mathbf{\hat{x}}$에 대해

$$
\mathbf{r} = \mathbf{b} - \mathbf{A}\mathbf{\hat{x}}
$$

라는 잔차를 정의하면, 이 잔차가 0이 아닐 때, 그 원인이 트렁케이션인지 라운딩인지에 따라 향후 반복 과정에서 오차가 누적되거나 빠르게 감소할 가능성이 달라진다. 예를 들어,

* 트렁케이션 오차가 큰 경우에는 본질적으로 $\mathbf{A}$나 $\mathbf{b}$가 근사값에 의해 바뀐 것이라고 볼 수 있다.
* 라운딩 오차가 큰 경우에는 행렬 연산 과정에서 부정확한 곱셈이나 덧셈이 누적되었음을 의미한다.

이러한 잔차 해석을 토대로, 알고리즘 단계별로 오차가 어떻게 전파되는지를 분석하고, 필요한 경우 재연산(re-computation)하거나 정밀도를 높이거나, 더 나은 분해(decomposition) 방식을 모색하는 식으로 개선안을 찾는다.

#### 편미분방정식(PDE)에서의 오차 균형

트렁케이션 오차와 라운딩 오차의 상호작용은 편미분방정식(Partial Differential Equation, PDE)을 수치적으로 푸는 과정에서 더욱 복잡하게 나타난다. 유한차분법(Finite Difference Method), 유한요소법(Finite Element Method), 유한체적법(Finite Volume Method) 등 다양한 수치 기법을 적용할 때, 기본적으로 그리드(격자) 혹은 요소 단위로 공간과 시간을 이산화한다. 이 과정에서 발생하는 대표적 오차는 공간 및 시간 분할에 따른 트렁케이션 오차와, 매 스텝마다 실제 계산을 수행할 때 생기는 라운딩 오차다.

**국소 오차(Local Error)와 전역 오차(Global Error)**

PDE를 풀기 위해 시간 또는 공간을 작은 구간($\Delta t$, $\Delta x$ 등)으로 나누어 유한차분 근사를 쓰면, 각 작은 단계(스텝)마다 국소(local) 트렁케이션 오차가 발생한다. 이 국소 오차가 누적되어 최종 시점에 나타나는 전체 오차를 전역(global) 오차라 부른다. 예를 들어, 열 방정식(Heat Equation)을 1차원으로 단순화해 시간-공간 격자를 구성하면, 한 시점에서 다음 시점으로 전진(Explicit)하는 과정에서의 근사 오차가 매번 더해져 전체 시뮬레이션 동안 전역 오차로 나타난다.

국소 오차는 일반적으로 $\Delta t$, $\Delta x$의 몇 제곱에 비례하는 형태($O(\Delta t^p)$, $O(\Delta x^q)$)를 갖는다. 전역 오차는 그 누적 결과이지만, 알고리즘의 안정성이 충분히 확보된다면 국소 오차 차수와 비슷한 차수로 전역 오차가 수렴하게 된다. 불안정한 알고리즘의 경우, 국소 오차가 과도하게 증폭되어 전역 오차가 기하급수적으로 커질 수도 있다.

**CFL 조건(Courant-Friedrichs-Lewy Condition)과 안정성**

편미분방정식을 수치적으로 풀 때 나타나는 대표적 안정성 조건 중 하나가 Courant-Friedrichs-Lewy(CFL) 조건이다. 이는 파동 방정식이나 유체 흐름 방정식과 같이 전파 속도를 갖는 PDE에서, 시간 스텝 $\Delta t$와 공간 스텝 $\Delta x$, 그리고 물리적인 파동(또는 신호 전파) 속도 $v$ 사이에 다음과 같은 형태의 제약이 존재함을 말해 준다.

$$
\frac{v ,\Delta t}{\Delta x} \leq C
$$

여기에서 $C$는 계통마다 다른 상수(예: 1, 혹은 조금 작은 값)일 수 있다. 이 조건을 어기면 국소 오차가 다음 시점으로 전이될 때 제어할 수 없는 발산(unstable) 현상이 발생하여 전역적으로 풀어놓은 해가 크게 어그러질 수 있다.

트렁케이션 오차 관점에서, $\Delta x$와 $\Delta t$가 서로 어울리는 적절한 비율을 가져야만 오류가 수렴 범위 내에서 머무른다. 너무 큰 $\Delta t$를 택하면 간단히 말해 “정보가 지나치게 먼 곳까지 한 번에 뻗쳐가는” 근사를 하게 되어 안정성을 잃는다. 이와 동시에, $\Delta t$와 $\Delta x$가 너무 작으면 반복 연산 횟수가 크게 증가하여 라운딩 오차 누적이 심해진다. 결국, 트렁케이션 오차와 라운딩 오차의 균형을 맞추는 $\Delta t, \Delta x$ 선택이 중요하다.

**유한요소법(FEM)에서의 트렁케이션 오차**

유한요소법(FEM)에서도 트렁케이션 오차는 요소의 크기(메시의 해상도)와 근사 함수(보간 다항식) 차수에 의해 결정된다. 요소가 작아지면 근사력이 향상되어 트렁케이션 오차가 줄지만, 그만큼 해석해야 할 요소의 수가 많아져서 연산 횟수가 크게 늘어난다. 고차 폴리노미얼(예: 2차, 3차 이상)을 사용하면 정밀도가 좋아질 수 있지만, 해석 과정에서 빼기 연산이나 축적 오차가 많아지면 라운딩 문제가 도드라질 수 있다.

일반적으로는 2차, 3차 정도의 중간 차수 요소를 선호하기도 하며, 메시 크기가 지나치게 작아지지 않도록 적절한 지침이 제공된다. 동시에, 선형계 $\mathbf{A}\mathbf{x} = \mathbf{b}$를 풀 때에는 난수 조건수를 가진 대형 행렬이 만들어질 수 있는데, 이때도 라운딩 오차가 크게 부각될 가능성이 있으므로, 정규화나 사전조건화(preconditioning) 기법을 사용하는 것이 보편적이다.

**반복해법(Iterative Method)과 축적 오차**

편미분방정식에서 크게 규모가 늘어나는 해법은 직접행렬분해(Direct Factorization) 대신 반복해법(Iterative Method)을 자주 이용한다. 대표적인 것이 Conjugate Gradient(CG), GMRES, BiCGSTAB 등이 있다. 이들 방법은 매 단계에서 잔차를 줄여나가며 근사해를 구한다. 그러나 반복 횟수가 증가할수록, 매 단계에서 발생하는 라운딩 오차가 누적될 수 있다. 이런 문제를 완화하기 위해 사전조건화(Preconditioning)를 적용하거나, 혼합정밀도(Hybrid Precision) 기법을 도입하여 민감 구간에서만 높은 정밀도로 연산을 수행하기도 한다.

**다차원 문제에서의 축적 오류**

2차원 혹은 3차원 PDE로 확장할 경우, 격자 점(노드)의 수가 지수적으로 증가하므로, 연산 횟수 역시 급격히 커진다. 이는 라운딩 오차가 더 많이 누적될 가능성을 키운다. 따라서 대형 문제를 풀 때는 알고리즘의 복잡도만큼이나, 각 스텝에서 발생하는 반올림 오차가 전역 해석 결과에 미치는 영향을 면밀히 살펴야 한다. 조건수가 좋지 않은(ill-conditioned) 행렬이 형성될수록, 작은 반올림도 최종 결과에 큰 차이를 만들 수 있다.

**병렬 처리 환경에서의 고려사항**

현대의 수치 시뮬레이션은 병렬 컴퓨팅 환경(GPU, HPC 클러스터 등)에서 수행되는 경우가 많다. 이때 같은 연산이라도 실행 순서, 스레드 배치, 통신 지연에 따라 덧셈이나 곱셈의 결과가 달라질 수 있으며, 병렬 합산 과정에서 라운딩 오차가 변동된다. 특히 정확한 반복 순서를 재현하기 어렵기 때문에, 같은 입력으로 실행해도 매번 조금씩 다른 결과가 나오는 상황이 벌어질 수 있다. 수치적으로 조건수가 양호하고 알고리즘 자체가 안정적이라면, 병렬 처리 오차 역시 크게 문제되지 않지만, 민감한 문제일수록 병렬 처리에서의 라운딩 오차 효과가 도드라질 가능성이 있다.

**요점 정리**

PDE 수치해법에서는 공간, 시간, 근사 차수, 전처리 기법 등 여러 파라미터가 서로 복합적으로 작용한다. 트렁케이션 오차를 줄이려면 분할을 촘촘히 하거나 고차 근사를 써야 하지만, 그 대가로 연산 횟수가 늘어 라운딩 오차가 누적된다. 또 문제의 물리적 특성(파동 전파 속도, 확산 계수, 비선형도 등)과 조건수의 크기에 따라, 오차 통제가 쉽지 않아질 수 있다. 이를 해결하기 위해서는 수치 안정성 분석, 알고리즘 설계, 조건수 개선, 그리고 정밀도 선택 등 다양한 측면의 노하우가 종합적으로 요구된다.

#### 멀티그리드(Multigrid) 기법과 여러 스케일에서의 오차

PDE를 풀 때, 잔차를 빠르게 줄이기 위해 멀티그리드(Multigrid) 기법을 쓰기도 한다. 멀티그리드 방식에서는 서로 다른 격자 스케일(예: 미세 격자, 중간 격자, 거친 격자)을 교대로 활용하여, 각 스케일에 맞는 주파수 대역의 오차 성분을 효율적으로 제거한다. 미세 격자는 주로 고주파(짧은 파장) 성분을, 거친 격자는 저주파(긴 파장) 성분을 효과적으로 감쇠할 수 있다.

이 과정에서 트렁케이션 오차와 라운딩 오차가 각 격자 스케일마다 다른 양상으로 나타난다. 미세 격자에서는 정점 수가 많아 연산량이 증가하므로 라운딩 오차 누적이 두드러질 수 있다. 거친 격자에서는 요소 해상도가 떨어져 트렁케이션 오차가 커질 수 있다. 결국 여러 격자를 오가며 순환(V-cycle, W-cycle 등)하는 알고리즘 디자인 자체가 두 오차를 모두 적절히 제어하도록 설계된다.

멀티그리드 기법의 이론적 근거는 Two-Grid Analysis라는 수학적 틀 위에서 전개된다. 여기서는 주어진 잔차를 거친 격자로 사영(projection)하고, 그 격자에서의 보정값(correction)을 다시 미세 격자 해에 더해 준다. 이를 반복하면, 미세 격자에서 단순 반복에 비해 훨씬 빠른 수렴을 유도할 수 있다. 이때 파라메터 선택(스무딩(smoothing) 연산 횟수, 거친 격자 구성 방식 등)을 잘못하면 오히려 잔차가 불균형하게 남거나 라운딩 오차가 특정 단계에서 과도하게 누적될 수 있으므로 유의해야 한다.

#### 도메인 분할(Domain Decomposition)과 경계 문제

도메인 분할 기법(Domain Decomposition)도 대규모 PDE 해석에서 자주 사용되는 방법이다. 물리적 영역을 여러 하위 영역으로 분할하고, 각각의 영역에서 독립적으로 계산한 뒤 경계(Interface)에서 조건을 교환하여 전체 문제의 해를 수렴시키는 방식이다. 대표적으로 Schwarz 알고리즘, DD-적분방정식 변환, FETI(Finite Element Tearing and Interconnecting) 등이 있다.

이 방식에서는 영역 간 경계 처리를 할 때, 트렁케이션 오차가 경계 근방에서 집중되거나, 서로 다른 영역에서 계산된 중간 해가 경계에서 큰 불연속을 일으킬 위험이 존재한다. 또한 여러 영역에서 얻은 해를 병렬로 합성할 때, 각 영역의 해석 과정에서 발생한 라운딩 오차가 경계 조건 교환 시 누적되기도 한다. 이런 이유로 도메인 분할 알고리즘의 안정성 해석 및 경계 보정 기법이 중요해진다.

도메인 분할을 사용하는 한 가지 큰 이점은 병렬화가 용이하다는 것이다. 각 부분 영역을 다른 프로세서나 노드에서 계산한 뒤, 부분 해들을 모아 전체 해를 한 단계씩 수렴시키는 방식이다. 덕분에 계산 시간은 크게 단축되지만, 병렬 환경에서의 비동기적 연산과 반올림 순서 변화로 인해 결과가 재현성(reproducibility)을 잃을 가능성도 있다. 이런 재현성 손실은 대규모 HPC(High-Performance Computing) 환경에서 자주 접하는 문제이며, 알고리즘적으로 수치 안정성에 중점을 두어야 한다는 점이 다시 강조된다.

#### 분산 메모리·공유 메모리 시스템에서의 수치 오차

현대 병렬 컴퓨팅 구조는 크게 분산 메모리(MPI)와 공유 메모리(오픈MP, 스레드 기반)로 나뉜다. 분산 메모리 구조에서는 각 프로세스 간 통신 과정에서 데이터가 순차적으로 모이거나 흩어지는 시점에 라운딩 오차가 가변적으로 발생할 수 있다. 공유 메모리 구조에서는 스레드 사이의 연산 순서가 동적으로 바뀜에 따라 덧셈, 뺄셈 결과가 달라질 여지가 크다.

예컨대 분산 메모리 환경에서 대규모 스칼라 합산을 할 때, MPI\_Reduce 함수가 바이너리 트리 방식이나 순차적 방식 등 어떠한 방식으로 합을 취하는지에 따라 최종 합 결과가 달라질 수 있다. 이는 라운딩 오차가 단일 프로세서에서 모든 항을 같은 순서로 더했을 때와 병렬 트리로 분산하여 더했을 때 달리 나타나기 때문이다. 이런 차이는 문제에 따라 크거나 작을 수 있지만, 민감도가 높은 문제라면 전혀 다른 수치 결과를 얻게 할 수도 있다.

#### 아비트러리 프리시전(Arbitrary Precision)과 혼합컴퓨팅

특정 단계에서 오차 허용범위를 더 엄격히 관리하기 위해, 부분 연산만 임의 정밀도(Arbitrary Precision)로 처리하는 방식도 시도되고 있다. 예컨대 도메인 분할 기법에서 경계 조건을 교환하는 과정이나, 멀티그리드에서 가장 거친 스케일에서의 보정 연산을 높은 정밀도로 수행하여, 연산 순서 변화가 초래하는 누적 오류를 줄이는 식이다. 이를 GPU나 특수 코프로세서에서 가속(Acceleration)하기 위해서는 추가적인 하드웨어 지원이나 소프트웨어 레벨의 최적화가 필요하다.

클러스터 환경에서도 혼합정밀도 라이브러리를 통해 특정 시점에 한해 quadruple precision(128비트) 또는 더 높은 비트를 사용하고, 나머지 일반 연산은 배정밀도(double precision)로 수행함으로써 계산 효율과 오차 안정성을 모두 꾀할 수 있다. 실무 현장에서는 이와 같은 기법들이 날씨 예측, 기상 모델, CFD(전산유체역학), 구조 해석 등 대규모 시뮬레이션 분야에서 점점 빈번히 논의되고 있다.

#### 경험적 에러 진단과 우도(尤度) 추정

PDE 해석 결과에 대한 신뢰도(우도)를 판단하기 위해, 해석이 끝난 뒤 실제 물리 데이터(실험 결과 등)와 대조해 오차 분포를 분석하기도 한다. 이때 관측값과 수치해석값 간의 잔차를 통계적 모형으로 이해하면, 트렁케이션 오차와 라운딩 오차가 혼합되어 나타나는 형태를 확률 분포로 근사할 수 있다. 간단히는 평균과 표준편차로 추정하거나, 베이지안(Bayesian) 관점에서 사후분포를 계산하기도 한다.

이러한 후처리 단계에서 오차 기여 요인을 분리해 보면, 서로 다른 공간 범위나 시간 구간에서 각각의 오차 성분이 지배적일 수 있음이 드러난다. 예컨대 경계층(Boundary Layer)에서 트렁케이션 오차가 크고, 내부 요소(domain interior)에서는 라운딩 오차나 조건수 문제로 인해 잔차가 커질 수 있다. 이렇게 세밀한 진단을 거쳐, 문제 부위를 집중 보강하는 방식으로 수치 알고리즘을 재설계하게 된다.

#### 절대 오차(Absolute Error)와 상대 오차(Relative Error)

오차를 정량화하는 대표적 방식으로 절대 오차와 상대 오차가 있다. 절대 오차는 정확한 값과 근사값 사이의 단순한 차이를 의미하며, 다음과 같이 정의한다.

$$
\text{Absolute Error} = |x - \hat{x}|
$$

여기에서 $x$는 참값, $\hat{x}$는 근사값이다. 상대 오차는 절대 오차를 참값의 크기로 정규화(normalization)한 형태로, 다음과 같이 정의된다.

$$
\text{Relative Error} = \frac{|x - \hat{x}|}{|x|}
$$

상대 오차는 값 자체가 클 때의 작은 차이와, 값이 매우 작을 때의 동일한 차이를 다르게 취급한다. 즉, 큰 규모의 문제에서 조금의 차이가 실제 의미상으로는 작을 수 있고, 반대로 매우 작은 값에서의 미세한 차이가 실제로는 큰 변동일 수 있다. 라운딩 오차나 트렁케이션 오차를 해석할 때는 이 절대·상대 오차의 관점을 함께 고려해야, 문제의 규모가 바뀌어도 일관된 기준으로 오차를 평가할 수 있다.

수치해석에서 많은 경우, 상대 오차가 더 중요한 지표가 되는데, 이는 문제를 스케일에 무관하게 접근하기 쉽기 때문이다. 그러나 어떤 상황에서는 (예: 근처가 0인 값을 다룰 때) 상대 오차를 정의하기 어려워, 절대 오차가 더 적합하거나, 두 오차를 병행해 보는 방식이 필요하다.

#### ULP(Units in the Last Place) 개념

라운딩 오차 분석에서 자주 등장하는 ULP(Units in the Last Place)는 컴퓨터가 표현하는 부동소수점 수에서 “마지막 자리”가 의미하는 물리적 양을 가리킨다. 예를 들어, 배정밀도(double precision)에서 어떤 특정 구간의 수를 표현할 때, 맨 마지막 비트 하나가 바뀌면 실제 값이 얼마만큼 변하는지 그 단위를 ULP라 부른다. 이 ULP 크기는 수 자체의 지수부에 따라 달라지므로, 고정된 정밀도가 아니라 상대적 개념에 가깝다.

ULP를 이용하면 라운딩 오차를 “몇 ULP가 틀렸다”는 식으로 평가할 수 있다. 예컨대 1 ULP 이내로 반올림되면, 해당 구간에서 표현 가능한 가장 가까운 부동소수점 값으로 정밀하게 반올림되었다고 본다. 이를 통해 결과가 표현 계층에서 얼마나 정확하게 근사되었는지 좀 더 직접적으로 확인할 수 있다.

#### 효율과 오차 사이의 절충

트렁케이션 오차와 라운딩 오차를 줄이려면 각종 고차 기법, 미세 분할, 고정밀 라이브러리 등을 적용해야 하며, 이는 필연적으로 계산 비용과 메모리 사용량을 늘린다. 실제로 많은 수치해석 응용에서는 정밀도 요구사항과 계산 자원의 한계 사이에서 절충점을 찾는 과정이 필수적이다. 예컨대,

* 문제 특성상 결과가 대략적인 수준이면 충분한 경우에는 저차 방법이나 표준 정밀도(double precision)로도 충분하다.
* 의료나 항공·우주 분야처럼 사소한 오차가 매우 치명적 결과를 부를 수 있는 경우에는, 고정밀 연산(quadruple precision 이상의 정밀도)이나 특별한 오차 보정 기법을 적극적으로 도입한다.

이처럼 상황마다 다른 기준으로 최적화해야 하므로, 오차 분석은 단순히 계산 결과의 “정확성”에 국한되지 않고, “비용 대비 성능”까지 고려하는 융합적 의사결정 과정을 포함한다.

#### 잔여 연구 과제

수치 알고리즘이 다양해지고, 컴퓨터 아키텍처가 점점 병렬화·이기종(heterogeneous)화되는 현실에서는 오차 문제도 나날이 복잡해진다. 앞으로의 연구 과제에는 예측 불가능한 라운딩 과정의 동적 재현성, 임의 정밀도 라이브러리의 자동 적용, 자동 미분(Automatic Differentiation)과 결합된 오차 추적 기법 등이 포함된다. 특히 대규모 머신러닝이나 최적화 문제는 정밀도 희생과 계산량 간의 타협을 적극적으로 하고 있으므로, 이러한 맥락에서의 트렁케이션 오차와 라운딩 오차 제어도 중요하다.
