다음 계산에서 숫자 부동 소수점 오류를 줄이고 싶습니다. 가변 w
가 [0,1]
및 b
의 범위 [1,~1000000]
에서 부동 소수점 상수를 나타내는 범위 내에서 어떤 부동 소수점 수를 나타낸다중첩 된 제품의 정확한 합계
b_3+w_3*(b_2+w_2*(b_1+w_1*(b_0+w_0)))
:
는 I는 다음과 같은 형태의 식을 갖는다. b
은 아래 첨자로 단조롭게 증가합니다 (중요하지는 않지만). 로이 재귀 적으로 정의 할 수 있습니다
b_4+w_4*(c_3+w_3*(b_2+w_2*(b_1+w_1*(b_0+w_0))))
:
func(x,n):
if(n==MAX)
return x
else
return func(b[n]+x*w[n],n+1)
func(1,0)
내가 온라인 요약을 수행한다면, 나는 Kahan 액수 알고리즘을 사용할 수 있습니다 (Kahan 당연히,이 용어의 수를 확장 할 수 1965), 또는 몇 가지 다른 방법 중 하나를 Higham 1993 또는 McNamee 2004, 내 오류의 크기를 제한합니다. 온라인 반복 제품을 사용하는 경우, 문제를 합계로 줄이기 위해 일종의 변환 기술을 사용할 수 있습니다.
그렇듯이이 특정 문제에 대해 어떻게 접근해야할지 모르겠습니다. 누구든지 생각을 가지고 있습니까 (그리고 그들과 함께 가기위한 인용문)?
감사합니다.
Higham 1993. "부동 소수점 합계의 정확도". 과학 컴퓨팅 저널 SIAM.
Kahan 1965. "실습 : 잘라 내기 오류 감소에 대한 추가 설명". CACM. "10.1145/363707.363723".
McNamee 2004. "정확한 합산을위한 방법 비교". SIGSAM Bull. "10.1145/980175.980177".
나열된 표현식은 Horner의 방법을 사용한 다항식 평가입니다. 실제로 "pow"및 곱셈의 계산에 내재 된 많은 오류를 일반적으로 줄입니다. –