M_PI는 3.14159265358979323846으로 정의되는 매크로이며 double보다 정확합니다. 나는 플로트에서 대답을 얻으려고 노력하고 있으며 캐스팅의 양이 도움이 될 것입니다. 결과는 항상 6.12323426e-017 또는 -4.37113883e-008입니다. M_PI를 플로트에 캐스트하면됩니다.cos (M_PI/2)의 결과를 처리하는 방법
답변은 0이어야하며 플로트에 저장하고 싶습니다.
M_PI는 3.14159265358979323846으로 정의되는 매크로이며 double보다 정확합니다. 나는 플로트에서 대답을 얻으려고 노력하고 있으며 캐스팅의 양이 도움이 될 것입니다. 결과는 항상 6.12323426e-017 또는 -4.37113883e-008입니다. M_PI를 플로트에 캐스트하면됩니다.cos (M_PI/2)의 결과를 처리하는 방법
답변은 0이어야하며 플로트에 저장하고 싶습니다.
그건 불가능합니다. 유한 부동 소수점 데이터 유형에서 pi의 정확한 값을 표현할 방법이 없습니다.
일반적으로 부동 소수점 값에 대한 연산은 실제 값에 대한 해당 수학 연산과 정확히 일치 할 것으로 기대할 수 없습니다. 일반적인 접근 방식은이 경우, 허용 오차는 특정 문제에 필요한 정확도가 어려운 부분입니다 얻을 tolerance
의 적절한 값을 선택
if (std::abs(result) < tolerance) {
// treat it as zero
}
같은 아마 뭔가를 비교하는 것입니다.
pi의 부동 소수점 표현은 기계 엡실론보다 pi에 더 가까이 있지 않으므로 두 개 이상의 해당 값의 코사인은 예상되는 결과 0과 유사합니다. 수학적으로 pi의 부동 소수점 값은 PI + EPS로 표현하고, 따라서 함수 호출의 값이 M_PI
매크로는 사실을 변경하지 않고 한 번보다 정밀도를 사용
cos(pi/2 + eps/2) = -sin(eps/2) ~= -eps/2.
아래쪽 투표를 이해하지 마십시오. 단지 cos (M_PI/2)의 결과가 작은 숫자 일 것으로 OP에게 설명하려고 시도하십시오. – sfjac
사실되도록 코사인 함수의 인수 M_PI/2
은 double로 계산됩니다.
따라서 'pi/2'와 정확히 일치하는 코사인을 계산하는 대신 'pi/2'에 가장 가까운 부동 소수점의 코사인을 계산합니다. 따라서 결과는 정확하게 0이 아닙니다.
캐스팅 양이 변경되지 않습니다.
정확하게 두 배 정확 해 보입니다. – Teepeemm
'cos (x)'가 합리적인 유일한'x'는'0'입니다. 모든 부동 소수점 수는 합리적입니다. 참으로 그들은 분모가 2의 제곱 인 합헌자입니다. 라이브러리의 코사인 구현이 아니라 기대치가 잘못되었습니다. – tmyklebu