부동 소수점 함수의 내재 된 정밀도


9

정규 분포 CDF를 계산하는 다른 프로그래머의 함수 구현을 검토하는 동안 전체 구현을 Python의 내장 함수로 대체하거나 일반적인 과학 라이브러리 인 SciPy를 사용 하도록 제안 했습니다.

다른 프로그래머는 문서에 정확한 보증을 제공 하지도 math.erfc()않습니다 scipy.stats.norm.cdf(). 따라서, 나는 (A에서 찍은 근사 알고리즘 교체에 대한 더 신중해야 존경 소스 , 그리고 한 오류 경계를 문서화을 ).

솔직히 말해서, 내장 또는 라이브러리 기능의 정확성과 정확성을 의심하려는 생각은 결코 내 마음을 넘지 못했습니다. 결국, 내가 좋아하는 기능을 호출 봤는데 sin()sqrt()이유는해야한다 - 많은 생각없이 년을 math.erf()또는 scipy.stats.norm.cdf()어떤 다른를 할 수?

하지만 지금은 걱정입니다. 내 질문은 :

  1. 일반적으로 문서에 특별한 언급이 없으면 IEEE 배정 밀도 부동 소수점이 제공하는 정밀도 내에서 이러한 종류의 함수가 마지막 소수점 자리까지 완전히 정확하다는 것을 암시합니까?
  2. 특히 파이썬 math.erf()이나 사이 파이의 경우에 해당 scipy.stats.norm.cdf()됩니까? 어떻게 알 수 있습니까?
  3. 매뉴얼 페이지는sin() 말합니다…

    이 함수는 인수가 pi의 배수에 가까워 지거나 0.0에서 멀어지면 정확도가 떨어질 수 있습니다.

    사인 함수가주기적이고 대칭적일 때 왜 이러한 경고가 존재해야합니까? 최적의 정확도를 얻기 위해 입력을 정규화하는 것은 호출자에게 부담이되는 것 같습니다.

    반면에 모질라의 문서 Math.sin()는 정확성이나 정확성에 대해 아무 말도하지 않습니다. 그것은 완전히 정확하거나 Math.sin()다른 곳과 같이 JavaScript의 특정 상황에서만 정확 하다는 "상식" 입니까?


1
문제 1에 대한 참고 1 : 일반적으로 정밀도 보증은 부동 소수점 의 이진수 를 나타내는 ULP (마지막 장소의 단위)로 제공 됩니다.

답변:


10

문서에 특별한 언급이없는 경우, 이러한 종류의 함수는 IEEE 배정 밀도 부동 소수점이 제공하는 정밀도 내에서 마지막 소수점까지 완전히 정확함을 암시합니까?

나는 그런 가정을하지 않을 것입니다.

내가 일하는 곳에서는 원격 측정 데이터를 다루며, 두 개의 수학 라이브러리가 IEEE 부동 소수점 표준을 모두 준수하더라도 두 개의 서로 다른 수학 라이브러리가 서로 다른 두 가지 결과를 생성 할 수 있다는 것은 일반적인 지식입니다 . 계산을 반복하고 두 결과가 동일한 지 비교할 때 의미가 있습니다.

최적의 정확도를 얻기 위해 입력을 정규화하는 것은 호출자에게 부담이되는 것 같습니다.

그것은 공정한 평가입니다. 그것을 받아 들일 수있게하는 것은 문서에 명시되어 있으므로 놀라운 일이 없다는 것입니다.

반면에 모질라의 문서는 ...

각 라이브러리 또는 프로그래밍 언어에서 (특히 sin()배수의 근처 와 같은 경계 영역 근처에서) 몇 가지 계산을 시도 pi하고 비교하는 것이 좋습니다. 이것은 각각의 행동에서 어떤 종류의 행동을 기대할 수 있는지에 대한 공정한 아이디어를 제공해야합니다.


2
테스트는 좋은 생각입니다. 문서가 한 가지를 말하지만 수많은 기능이 다른 방식으로 작동하는 경우가 수없이 많습니다. 그리고 OP는 문서화되지 않은 암시적인 가정에 의존하기를 원합니다.
Siyuan Ren
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.