2017-12-18 33 views
4

JavaScript에서 왜 삼각 함수의 일부 이상한 값을 얻는 지 이해할 수 없습니다. 예를 들면 다음과 같습니다.JavaScript의 삼각 함수가 작동하지 않습니까?

Math.sin(Math.PI); // returns 1.2246467991473532e-16, but should return 0 
Math.cos(Math.PI/2); // returns 6.123233995736766e-17, but should return 0 
Math.sin(3.14); // returns 0.0015926529164868282, whitch is ok but 
Math.sin(3.141592); // returns 6.535897930762419e-7! 

Mozilla와 Chrome에서이 작업을 시도한 결과 동일한 결과가 나타났습니다. 삼각 함수의 매개 변수가 너무 정확합니다.

도와주세요!

+1

1.22e-16은 0에 매우 가깝습니다. 정확하게 말하면 0.000000000000000122입니다. Math.PI는 PI의 완벽한 표현이 아니므로 PI는 무한하며 모든 변수에 포함될 수 없기 때문에 항상 근사값을 구할 것입니다. – DarkerIvy

+0

아, 나는 e-16을 보지 못했기 때문에 대답이 잘못되었다고 생각했습니다. 감사합니다 @Darkerlvy –

+0

문제는 없습니다. 최종선은 부동 소수점이 매우 정확하다는 것입니다. 따라서 부동 소수점이 완벽 함을 보여줄 수도 있습니다. – DarkerIvy

답변

1

에는 Number.EPSILON 재산권 1 작은 부동 소수점 수보다 1

차이를 나타내는 Number.EPSILON

사용 값의 절대 델타 걸릴 값을 원하고 있었다 그것이 Number.EPSILON보다 작은 지 확인하십시오. true이면 값의 오류가 부동 소수점 연산의 가능한 오류보다 작습니다.

console.log([ 
 
    [Math.sin(Math.PI), 0], 
 
    [Math.cos(Math.PI/2), 0], 
 
    [Math.sin(3.14), 0.0015926529164868282], 
 
    [Math.sin(3.141592), 6.535897930762419e-7] 
 
].map(([a, b]) => Math.abs(a - b) < Number.EPSILON));

부동 소수점 값의 제한 디지털 표현의 문제에 대해 읽어 좀 더 :