2014-11-21 10 views
-1

M_PI는 3.14159265358979323846으로 정의되는 매크로이며 double보다 정확합니다. 나는 플로트에서 대답을 얻으려고 노력하고 있으며 캐스팅의 양이 도움이 될 것입니다. 결과는 항상 6.12323426e-017 또는 -4.37113883e-008입니다. M_PI를 플로트에 캐스트하면됩니다.cos (M_PI/2)의 결과를 처리하는 방법

답변은 0이어야하며 플로트에 저장하고 싶습니다.

+0

정확하게 두 배 정확 해 보입니다. – Teepeemm

+0

'cos (x)'가 합리적인 유일한'x'는'0'입니다. 모든 부동 소수점 수는 합리적입니다. 참으로 그들은 분모가 2의 제곱 인 합헌자입니다. 라이브러리의 코사인 구현이 아니라 기대치가 잘못되었습니다. – tmyklebu

답변

3

그건 불가능합니다. 유한 부동 소수점 데이터 유형에서 pi의 정확한 값을 표현할 방법이 없습니다.

일반적으로 부동 소수점 값에 대한 연산은 실제 값에 대한 해당 수학 연산과 정확히 일치 할 것으로 기대할 수 없습니다. 일반적인 접근 방식은이 경우, 허용 오차는 특정 문제에 필요한 정확도가 어려운 부분입니다 얻을 tolerance의 적절한 값을 선택

if (std::abs(result) < tolerance) { 
    // treat it as zero 
} 

같은 아마 뭔가를 비교하는 것입니다.

+2

추가하기 만하면 ''에'FLT_EPSILON'과'DBL_EPSILON'이 있습니다. – Paul

+3

@ Paul : 상황에 따라 합리적인 가이드 라인이 될 수 있습니다 (약 1의 답을 예상하는 경우). 그러나 일반적으로 문제를 분석하고 처리 할 가치가있는 범위를 분석하여 이러한 값과 매우 다른 적절한 허용 오차를 찾아야합니다. –

+0

@ 폴 : 그게 뭔지 알지? 그리고 왜 그들이 당신이 비참하게 사용하는 공차가 아니라는 것을 알 것입니다, 그렇죠? – tmyklebu

-1

pi의 부동 소수점 표현은 기계 엡실론보다 pi에 더 가까이 있지 않으므로 두 개 이상의 해당 값의 코사인은 예상되는 결과 0과 유사합니다. 수학적으로 pi의 부동 소수점 값은 PI + EPS로 표현하고, 따라서 함수 호출의 값이 M_PI 매크로는 사실을 변경하지 않고 한 번보다 정밀도를 사용

cos(pi/2 + eps/2) = -sin(eps/2) ~= -eps/2. 
+0

아래쪽 투표를 이해하지 마십시오. 단지 cos (M_PI/2)의 결과가 작은 숫자 일 것으로 OP에게 설명하려고 시도하십시오. – sfjac

1

사실되도록 코사인 함수의 인수 M_PI/2은 double로 계산됩니다.

따라서 'pi/2'와 정확히 일치하는 코사인을 계산하는 대신 'pi/2'에 가장 가까운 부동 소수점의 코사인을 계산합니다. 따라서 결과는 정확하게 0이 아닙니다.

캐스팅 양이 변경되지 않습니다.