2012-12-12 4 views
0

주어진 x 점에서 주어진 함수 Func을의 미분 값을 계산 한이를 생각 좋은 정밀도를 얻을 수있는 자바 스크립트에서 파생 된 계산 : 어떤 x + Number.MIN_VALUE 지금의 정보는 다음의 제품에

a = Fun(x - Number.MIN_VALUE) 
b = Func(x + Number.MIN_VALUE) 
return (b-a)/(2*Number.MIN_VALUE) 

을 (또는 x - Number.MIN_VALUE) 둘 다 자바 스크립트에서 x를 반환합니다.

다른 값을 시도했으며 1 + 1e-15은 1.000000000000001을 반환합니다. 정밀도를 높이려고하면 1 + 1e-161을 반환합니다. 따라서 5e-324 인 Number.MIN_VALUE 대신 1e-15을 사용해야합니다.

자바 스크립트에서이 경우 더 나은 정밀도를 얻을 수있는 방법이 있습니까?

+0

'1 - 1e-15'는 다음을 반환합니다 : '0.999999999999999'; '1 - 1e-16'은 다음을 반환합니다 :'0.9999999999999999'; 여기에 문제가 표시되지 않습니다. – Cerbrus

+0

oops..edited. '1 + 1e-15'및 '1 + 1e-16'이다. – swair

+0

작업 할 수있는 특정 "범위"의 정밀도가 있습니다. 이는 [부동 소수점] (http://en.wikipedia.org/wiki/Floating_point) 숫자가 작동하는 방식과 관련이 있습니다. 그래서'1.0'과'1e-17' 이하로 계산할 수없는 반면, _can_는 작은 수를 나타냅니다. – Cerbrus

답변

2

이것은 실제로 javascript에 관한 것이 아닙니다.

포인트 사이의 간격을 줄이면 파생 상품의 정밀도가 향상되지 않습니다. 가까운 지점의 함수 값은 마지막 자리의 오류로 계산되며 마지막으로 오류는 점 분리보다 훨씬 커집니다. 그런 다음 거대한 상대 오차가있는 아주 작은 차이를 아주 작은 수로 나누면 가장 많이 쓰레기를 얻을 수 있습니다.

파생 값의 더 나은 가치를 얻는 가장 좋은 방법은 여러 점에서 함수를 계산하고 (매우 작은 분리가 아닌) 근사치 다항식을 구성하여 관심 지점에서 구별하는 것입니다.

+0

좋습니다. 이 작업을 수행하는 라이브러리를 가르쳐 주시겠습니까 (파이썬이나 루비보다 더 높은 언어 라이브러리가 좋음). 나는 sympy 소스 코드를 파고있다. 아직 유용한 것을 찾지 못했습니다. – swair

+0

몇 가지 강력한 방법과 라이브러리에 대한 참고 자료는 http://en.wikipedia.org/wiki/Automatic_differentiation을 참조하십시오. – begemotv2718