0

a, b는 32 비트 부동 소수점 값이고 N은 32 비트 정수이며 k는 0, 1, 2, ... M 값을 취할 수 있습니다. c_k = a + (N + k) * b를 계산한다; 연산은 32 비트 연산 (배정도가 아님)이어야합니다. 우려 정확성이다 - 다음 중 더 정확한?정확도는 c_k = a + (N + k) * b

I) C_K = A + (N + K) *

II) 제 계산

B이다 c_0 = A + N * B
그런 다음 c_1, c_2 등을 추가하여 반복적으로 계산합니다.
c_1 = c_0 + b;
c_2 = c_1 + b;

+0

내 II의 느낌은 옵션 II가 더 우수하다는 것입니다 (성능은 더 좋음). 그러나 나는 그것이 더 정확하다는 것을 확신하지 못합니다. 나는 그것이 데이터에 달려 있다고 생각한다. –

+4

마지막 결과의 반올림 오류가 체인의 각 추가에 대한 반올림 오류의 합계가되므로 최하위 작업은 수행 할 수있는 최악의 작업 중 하나입니다. 첫 번째 방법을 사용하거나'c_i = c_0 + b * i '를 사용하는 것이 더 정확할 것입니다. –

+0

@PatriciaShanahan 귀하의 의견에 답변을 제출해야합니다. 이 질문에 대한 중요한 정보입니다. – shoelzer

답변

2

IEEE 754 모델을 가정 할 때 조작 수는 신경 쓰이지 않아 32 비트 연산으로 정확하게 수행 할 수 있습니다.
참조 Shewchuck 적응 정밀 부동 소수점 연산과 빠른 강력한 기하학적 술어 - http://www.cs.berkeley.edu/~jrs/papers/robustr.pdf 또는 http://www-2.cs.cmu.edu/afs/cs/project/quake/public/papers/robust-arithmetic.ps

는 두 정확한 작업 (용지를 참조)

(product,residue) = twoproduct(a,b) 
(sum,residue) = twosum(a,b) 

는 그런 다음 두 가지로 N + K를 분해해야 정의 당신이 잠재적으로 부정확 곱셈

,691,363이 다음

NkH = (N+k)/256; 
NkL = (N+K) % 256; 

예를 들어 24 비트 significands, (210)

(HH , HL) = twoproduct(NkH , b) 
(LH , LL) = twoproduct(NkL , b) 

그럼 당신은

(c1,c2,c3,c4,c5) = sort_increasing_magnitude(HH,HL,LH,LL,a) 
(s2,s1) = twosum(c2,c1) 
(s3,s2) = twosum(c3,s2) 
(s4,s3) = twosum(c4,s3) 
(s5,s4) = twosum(c5,s4) 
(다시 볼 수있는 종이)이 (HH, HL) + (LH, LL) +이 빠른 속도로 확장 합과 정확하게 수행 할 수있는

합계 수

그런 다음 무한 정밀도 산술로 연산이 수행 된 것처럼 s5에서 정확히 반올림 된 결과를 얻습니다.

3

마지막 결과의 반올림 오류가 체인의 각 추가시 단일 작업 반올림 오류의 net 합계가되기 때문에 체인 추가는 수행 할 수있는 최악의 작업 중 하나입니다. 첫 번째 방법을 사용하거나 c_i = c_0 + b*i을 사용하는 것이 더 정확합니다.

관련 문제