반올림 오류에 대한 좋은 경계를 찾고 있다면 반드시 수차 정밀도 라이브러리가 필요하지 않습니다. 대신 오류 분석 실행을 사용할 수 있습니다.
좋은 온라인 참고 자료를 찾을 수 없었지만 Nick Higham의 저서 "숫자 알고리즘의 정확성과 안정성"의 섹션 3.3에 설명되어 있습니다. 아이디어는 매우 간단합니다.
- 각 라인에 단일 산술 연산을 단일 할당 할 수 있도록 코드를 리팩터링하십시오.
- 예를 들어
x
, 각 변수 에 대해 상수가 할당 x_err
되면 0으로 초기화 되는 변수 를 만듭니다 x
.
- 각 작업, 예를 들어
z = x * y
, 변수 업데이트 z_err
부동 소수점 연산의 표준 모델을 사용하고 결과 z
및 실행 오류 x_err
와 y_err
.
- 그런 다음 함수의 반환 값에도 해당
_err
값이 첨부되어야합니다. 이것은 총 반올림 오류에 대한 데이터 종속적입니다.
까다로운 부분은 3 단계입니다. 가장 간단한 산술 연산의 경우 다음 규칙을 사용할 수 있습니다.
z = x + y
-> z_err = u*abs(z) + x_err + y_err
z = x - y
-> z_err = u*abs(z) + x_err + y_err
z = x * y
-> z_err = u*abs(z) + x_err*abs(y) + y_err*abs(x)
z = x / y
-> z_err = u*abs(z) + (x_err*abs(y) + y_err*abs(x))/y^2
z = sqrt(x)
-> z_err = u*abs(z) + x_err/(2*abs(z))
u = eps/2
단위 반올림은 어디에 있습니까 ? 예, 대한 규칙 +
과 -
동일합니다. 다른 작업에 대한 규칙은에 op(x)
적용된 결과의 Taylor 시리즈 확장을 사용하여 쉽게 추출 할 수 있습니다 op(x + x_err)
. 또는 인터넷 검색을 시도 할 수 있습니다. 또는 Nick Higham의 책을 사용하십시오.
예를 들어 Horner 체계를 사용하여 a
점에서 계수의 다항식을 평가하는 다음 Matlab / Octave 코드를 고려하십시오 x
.
function s = horner ( a , x )
s = a(end);
for k=length(a)-1:-1:1
s = a(k) + x*s;
end
첫 번째 단계에서는 다음 두 가지 작업을 분할합니다 s = a(k) + x*s
.
function s = horner ( a , x )
s = a(end);
for k=length(a)-1:-1:1
z = x*s;
s = a(k) + z;
end
그런 다음 _err
변수 를 소개합니다 . 참고 입력 것을 a
및 x
가정은 정확하게,하지만 우리는 단지뿐만 아니라 또한 값을 해당 통과하도록 사용자에게 요구할 수 a_err
및 x_err
:
function [ s , s_err ] = horner ( a , x )
s = a(end);
s_err = 0;
for k=length(a)-1:-1:1
z = x*s;
z_err = ...;
s = a(k) + z;
s_err = ...;
end
마지막으로 위에서 설명한 규칙을 적용하여 오류 조건을 얻습니다.
function [ s , s_err ] = horner ( a , x )
u = eps/2;
s = a(end);
s_err = 0;
for k=length(a)-1:-1:1
z = x*s;
z_err = u*abs(z) + s_err*abs(x);
s = a(k) + z;
s_err = u*abs(s) + z_err;
end
우리는 더이 있기 때문에주의 a_err
또는 x_err
예를 들어, 그들은 0으로 가정되지는 각각의 용어는 단순히 오류 표현식에서 무시됩니다.
vo! 이제 결과와 함께 데이터 종속 오류 추정값 (참고 : 오류의 상한값) 을 반환하는 Horner 체계가 있습니다.
부수적으로, C ++을 사용하고 있기 때문에, _err
용어를 둘러싼 부동 소수점 값을위한 클래스를 직접 만들고 모든 산술 연산을 오버로드하여 위에서 설명한대로 이러한 값을 업데이트하는 것을 고려할 수 있습니다 . 큰 코드의 경우 계산이 덜 효율적이지만 경로가 더 쉬울 수 있습니다. 그렇게 말하면 온라인에서 그러한 수업을 찾을 수 있습니다. 빠른 Google 검색 으로이 링크가 제공되었습니다 .
± ux ( 1 ± u )