2015-01-19 11 views
2

C++ 11은 erferfc과 같은 표준에서 매우 유용한 수학 함수를 도입했습니다. 특정 값보다 크거나 작은 입력에 대해서는 "언더 플로우 보장"에 대한 언급이 있지만 정밀도 측면에서 이것이 무엇을 의미하는지 명확하게 이해하기 위해서는 부동 소수점 표현에 대해 충분히 알지 못합니다.std :: erf의 정밀도는 무엇입니까?

이 질문에 대한 답변은 다음과 같습니다. 표준 라이브러리에 의해 구현 된 근사값으로부터 어떤 정밀도 (적어도 크기의 차수)를 기대할 수 있습니까?

+0

지정되지 않았습니다. 나는 C++ 구현이 한 라디안의 사인을 요구할 때'42.0 '이라고 말할 수 있다고 믿습니다. 그러나 실제로는 배정도'erf'가 충실하게 반올림되었다고 가정 할 수 있습니다. 먹인 숫자에 가장 가까운 두 부동 소수점 숫자 중 하나를 얻을 수 있습니다. – tmyklebu

+0

@tmyklebu 나는 당신을 믿고 싶다. 그러나 그 숫자를 얻는다 고 가정하면, 표준 구현은 최소한 17 자리의 십진수를 가짐을 의미한다. 나는 (gcc와 clang) 사용하는 C++ 컴파일러의 벤더들을 존경하고 신뢰하지만, 이것은 내가 알 수있는 근사값의 대부분이 10 진수 7 자리의 정밀도를 넘지 않는다는 것을 고려하면 무리한 가정이라고 생각된다. 나는 불평하지 않는다. 나는 그것이 다소 조잡한 근사치가 될 것으로 기대한다, 나는 단지 내가 얼마나 조잡한 지 알 수 있기를 바란다. – Sheljohn

+0

매우 가깝지 않은 근사값을 제외하고는 "숫자"에서 이와 같은 함수의 정밀도를 측정 할 수 없습니다. 'x/3' 함수에 대해서도'double '을 반환하는 것은 17 자리까지는 올바르지 않습니다. 입력 '29'를 고려하십시오. "표준 C++"의 의미에서 "표준 구현"은 없지만 glibc의 것은 충실하게 둥글게 처리되어 있습니다. Apple이 잘했으면 좋겠어요. 나는 fdlibm의'erf' /'erfc'를 검사하지 않았습니다. – tmyklebu

답변

2

이것은 구현의 품질에 달려 있습니다. 이는 컴파일러의 공급 업체 (또는 별도로 획득 한 경우 런타임 라이브러리)에 달려 있습니다. 최상의 경우 정밀도는 사용하는 특정 유형의 정밀도와 일치합니다 (double, long double 등).

반환 값의 정밀도는 보장 된 언더 플로우와 관련이 없습니다. 이는 입력이 예상 도메인 밖에있을 경우 반환 값이 special underflow FP value임을 보장하는 강제적 인 사후 조건입니다.

+2

나는 최소 정밀도를 보장하지 않는 것이 표준에서별로 좋지 않다는 것을 알았다. 수치 처리를 위해 이러한 함수에 의존하기가 어렵습니다. 하지만 고마워, 내 질문에 대답 :) – Sheljohn

+1

예, 그게 인생을 훨씬 쉽게 만들 것입니다. 문제는 정확도가 높을수록 더 많은 계산 시간이 필요하기 때문에 달성하기 어려운 삼각 함수 연산에 의존하는 함수의 경우입니다. 이러한 연산을 수행하는 보조 프로세서가있는 경우 정밀도는 정밀도 등의 영향을받습니다. 따라서 여기에 표준을 세우는 것은 정말 어렵습니다. 특히 대규모 커밋의 경우에는 더욱 그렇습니다. –

+2

@ Sh3ljohn : 언어 표준은 특정 수학 함수에 대해 특별한 정확성을 필요로하지 않지만 라이브러리 공급 업체는 절대 오류, 상대 오류 또는 [ulp]로 표시된 구현의 최대 오류에 대한 정보를 제공 할 수 있습니다 http://en.wikipedia.org/wiki/Unit_in_the_last_place)이므로 문서를 확인하십시오. 견고한 수학 라이브러리는 일반적으로'erf()'와'erfc()'에 대해 몇 개의 (한 자릿수) ulps 오류를 결과로 제공합니다. – njuffa