2017-10-11 14 views
-2

f (x) = sqrt (1 + x) - sqrt (1-x)와 같은 함수에 대해 특정 x 값 범위에 대해 원하지 않는 결과를 얻습니다. 그러나 어떤 경우에는 원래 방정식을 사용하고 다른 방정식에서는 새로운 방정식을 사용하도록 방정식을 다시 작성할 수 있습니다.부동 소수점 산술 불안정성

x 값의 범위를 알아 내고 이러한 질문에 대한 대체 표현식을 찾는 방법은 무엇입니까? (온라인 조사에서 우리는 함수가 특정 값에 대해 본질적으로 "취소"하는 것을 원하지 않는다는 것을 알았지 만, 우리가 찾고있는 것이 전부인가? 예를 들어 f (x) = e^x - 1에서 우리는

+1

이 질문은 서면으로 너무 광범위합니다. 당신은 더 구체적 일 수 있습니까? –

+0

f (x) = sqrt (1 + x) - sqrt (1-x)는 부동 소수점 산술을 사용하여 계산할 때 불량한 결과를 나타내는 x 값의 범위를 제공 할 수 있습니까? "취소 오류"가 발생하지 않도록 이러한 x 값에 대해 f (x)에 대한 대체 표현식을 제공하십시오. – Brainpower2049

+1

@ Brainpower2049 : 작은'x'는 문제가 있습니다. 예를 들어'f (1e-16)'은'1.1102230246251565e-16'을주고, f (1e-17)는'0.0'을 준다. 수학적으로는 같지만 수치 적으로 같지 않은 표현식은'2 * x/(sqrt (1 + x) + sqrt (1-x))'입니다. 이것은 전체 도메인'[-1.0, 1.0]'에서 좋은 결과를 제공합니다. –

답변

3

불행히도, 여기에 황금색 글 머리 기호가 없습니다. 일반적인 방법은 많은 실험과 까다로운 오류 분석입니다. f (x) = 0? 유용한 도구는 다음과 같습니다.

  • MPFR과 같은 임의 정밀도 산술 라이브러리는 높은 정밀도를 사용하여 표현식을 계산하고 결과를 일반 정밀도와 비교합니다. 필자는 줄리아 (Julia)를 일반 수학 연산자와 함수를 지원하는 BigFloat 유형을 제공하므로 사용하고 싶습니다.
  • 간격 산술 : 오류에 대해 보장 된 경계를 제공합니다 (불안정한 계산이 폭발적으로 증가합니다). 개인 경험이있는 유일한 패키지는 ValidatedNumerics.jl입니다 (examples 참조).
  • herbie은 자동으로 수식을 수정하여 좀 더 안정적으로 사용할 수있는 멋진 기법을 사용합니다. 나는 개인적인 경험이 없지만 시원하게 보인다. (우연히도, 홈페이지에있는 예는 당신의 것과 아주 가깝습니다.)
+0

나는 허비가 유용하기 전에 훨씬 정교해야한다고 생각한다. OP의 표현식을 입력하면이 표현식이 유용 할 도메인이 무엇인지 알 수 없어도'1/8 x^3/+ (7/128 x^5 + x)'로 되돌아갑니다. –

+0

그건 이상합니다. 방금 해보기로했습니다. 작은 웹 응용 프로그램인데, 당신이 질문에서 질문에 제안한 답을 주었다.'(x + x)/(sqrt (1 + x) + sqrt (1-x))'. –

+0

흠, 그건 _ 이상합니다. 나는 여전히 이전과 같은 결과를 얻는다. (0 주위의 테일러 급수 확장). 비록 알고리즘에 임의의 입력이있는 것처럼 보입니다. 어쩌면 그것을 설명 할 수 있습니다. –