Spotlight가`cos (pi / 2)`에 잘못된 값을주는 이유는 무엇입니까?


8

아시다시피 Spotlight는 간단한 수학을 할 수 있습니다. 예를 들어, 입력 cos(pi)하면 -1예상 한대로 결과가 나타납니다 . 방금 입력했는데 cos(pi/2)0이어야하지만 나에게 줬습니다 -5e-12.

네 반올림 오류 일 가능성이 있지만 다음과 같이하십시오. cos(pi/2)! 제 생각에는 분명히 버그처럼 보입니다. 어떻게 생각해?


1
cos (x)는 초월 함수입니다. pi, pi / 2 등의 값을 하드 코딩하지 않으면 약간의 오류가 발생합니다.
Navin

@Navin 실제로이 값은 매우 중요하기 때문에 이러한 값을 하드 코딩 할 것으로 예상합니다.
poitroae

1
pi자체는 하드 코딩되어 cos(pi)있지만 ( -1에 대한 값을 얻음 ) 조작하자마자 부동 소수점 숫자를 얻습니다. OSX는 하드 코딩하지 않는 pi/2, pi/4등, 실제로 작업을 수행합니다.
harryg

2
@harryg 10 진수로 전환하여 해결할 수있는 반올림 오류가 있지만이 중 하나가 아닙니다. 십진수는 0.1정확하게 표현하려는 경우에 유용합니다 . 정확히 말하지만 pi와 같은 비이성적 인 숫자에는 이진 또는 소수로 정확하게 표현할 수없는 유용하지 않습니다.
코드 InChaos

1
루비에서 :irb(main):009:0> Math.cos(Math::PI/2) => 6.123233995736766e-17
harryg

답변:


13

pi의 정밀도 부족과 내장 시스템의 전체 정밀도 부족으로 인한 것입니다.

pi = 3.1415926536

pi/2 = 1.5707963268 

cos(1.5707963268) = -5.103412e-12

FYI =  5.103412e-12 = 0.000000000005103412 ~ 0 


전체 시스템 정밀도 정보 :

3.141592653589793238462643383 = 3.1415926536 

파이썬에서 우리는 다음을 얻습니다.

>>> float("3.141592653589793238462643383")
3.141592653589793

우리가 볼 수 있듯이 정밀도는 float 표현과 일치하지 않기 때문에 정밀도에 문제가 있습니다.


정밀도가 부족하기 때문에 부동 소수점 숫자에이 크기의 오류를 비난 할 수 없습니다.
Dennis Jaheruddin

2
아마도 파이 값으로는 정밀도가 떨어질 것입니다.
Matthieu Riegler

5

특이한 부동 소수점 정밀도로 π를 저장하지 않습니다. 배정 밀도로 π에 대해 잘못된 값을 사용하고 있습니다. 이진수로 3.1415926536 을 근사 하려면 최소 38 비트가 필요합니다.

3.14159265359922… > 11.001001000011111101101010100010001001

2 ^ -36은 약 1.5e-11이며, 후행 99와 일치합니다. 배정 밀도 부동 소수점 은 52 비트 유효합니다. cos(pi/2)-5e-12로 평가할 수있는 유일한 다른 선택은 48 비트 유형이며 매우 이상합니다.

미분 값이 거의 0 인 0과 π 근처에서 cos (θ)를 매우 정확하게 계산할 수 없습니다.

cos(3.1415926536) ≈ -0.999999999999999999999947911

-1 의해 5.2e-23에 대한 ε보다 작은 약 다르다고 double때문에 cos(3.1415926536)같이 계산된다 정확하게 -1 ... 이는 부정확하다.

± π / 2 근처에서 미분 [ -sin (θ) ]은 거의 ± 1이므로 입력의 오차가 출력이됩니다.

cos(1.57079632679961) ≈ -4.71338076867830836e-12
cos(1.57079632679962) ≈ -4.72338076867830836e-12
cos(1.57079632680000) ≈ -5.10338076867830836e-12

하나의 작은 숫자를 표시 cos(π/2)하고 -5.2e-12로 계산하는 TI 계산기가 있습니다. 그러나 전자적으로는 매우 다르며에 대한 정확한 가치를 제공하도록 설계되었습니다 cos(90°).

Spotlight에서 cos(pi/2)π 값을 검색하고 10 진수 문자열로 변환 하여 (정확하고 합리적인) 이진 값으로 저장합니다 .1100100100001111110110101010001000100100001101101111 (또는 10000), 2로 나눈 다음 본질적으로 빼기 π / 2 의 실제 값 cos(pi/2 + cos(pi/2))0에 더 가까운 지 확인해야 합니다 (-2.2e-35 일 수 있음).

2의 거듭 제곱으로 곱하면 유의 한 값이 아닌 지수에만 영향을 미칩니다. 반반 씩 반올림하거나 반올림하여 반올림을 적용하는 방법을 결정할 수 있습니다.


Markdown에 아무런 문제 가 없습니다. MathJax는 SE 전체가 아닌 Math 관련 사이트에서만 활성화됩니다.
grg

1
cos (pi / 2 + cos (pi / 2))는 0으로 정확하게 표시됩니다.
Nick Matteo

4

10.9.2에서 재현 가능한 버그이며 이와 같은 부동 소수점 반올림 오류는 매우 일반적입니다.

내가 추측해야 할 경우 충분한 정밀도없이 처리되는 pi의 가치입니다.

  • cos (999999 * pi)에 오류가 없습니다
  • cos ((999999 + 1) * pi)에 오류가 있습니다-반올림 일 가능성이 있습니다

나는 향할 것 https://developer.apple.com/bug-reporting/ 당신이 행동 애플의 버그 수정 장치를보고 싶다면.


5
정말 버그입니까? 그러한 작업의 정확성은 무엇입니까?
Édouard

등록 된 개발자는 아니지만 제출해 주시면 감사하겠습니다.
poitroae

4
@ Édouard 사용자가 기호 수학에 대한 일부 기능을 기대하게되면 버그로 간주 될 수 있습니다 . 모든 컴퓨터 대수 시스템 (CAS)은 물론 cos (π / 2) = 0임을 정확히 알게됩니다! 반면, Spotlight가 CAS를 포함 할 것으로 기대하는 것은 타당하지 않습니다. 그리고 부동 소수점 산술 영역에서는 OP 보고서와 같은 결과가 예상됩니다. 모든 버그 보고서에는 기능 요청의 레이블이 더 잘 표시 될 수 있습니다.
Harald Hanche-Olsen

1
@ Édouard bmike는 사실 이것이 반올림 오류가 아니라 버그 라는 점에서 정확합니다 . 표준 배정도 산술을 고려할 때 이러한 연산의 예상 정밀도는 10 ^ -12가 아니라 약 10 ^ -16입니다. CPU의 부동 소수점 지원을 활용하고 계산을 수행하며 결과의 비트 패턴을 검사하는 선호하는 언어로 프로그램을 작성하여 직접 시도 할 수 있습니다. bmike가 말했듯이 Spotlight가 사용하는 π 값이 충분히 정밀하게 정의되지 않았기 때문일 수 있습니다.
Szabolcs

2
뭔가 이상한 일이 일어나고 있습니다. cos(2*acos(0)*0.5)많은 주문을 반환합니다 10^-10. π 상수가 정확하지 않기 때문이 아닙니다. 나는이 결과를 설명 할 수 없다 : 배정도에 대해서는 너무 부정확하고 단 정도에는 너무 정확하지 않다.
Szabolcs

4

다른 답변과 의견에서 다음이 명확 해집니다.

소프트웨어가 완벽하게 구현 되어도 부동 소수점 계산의 한계에 도달하더라도 0이 아닌 결과를 얻는 것은 버그가 아닙니다. 그러나 10 ^ -12 순서의 오류는 실제로 큽니다.

이것은 부동 소수점 숫자의 부정확성을 비난하지 않습니다. 당신이 얻는 결과는 다음과 같습니다.

cos(1.5707963268)

다른 소프트웨어 패키지를 사용하여 확인할 수 있습니다. cos(pi/2)이러한 패키지 중 하나 에서 평가한다면 10 ^ -12보다 0에 훨씬 가까운 결과를 얻을 수 있습니다.

결론적으로 두 가지 가능한 제한 사항 중 하나를 적용해야합니다.

  1. Pi가 충분한 정밀도로 저장되지 않거나 적어도 pi / 2로 인해 정밀도가 충분하지 않습니다
  2. 왜냐하면 입력으로 정밀도가 충분하지 않습니다.

소프트웨어에 액세스 한 사람이이 중 어느 것을 적용하는지 확인할 수 있습니다.

업데이트 로 문제가 상수의 정확성 것 같다 주석에 언급 pi.


이상하다. 1.5707963268는 pi / 2를 계산할 때 Spotlight가 제공하는 결과입니다. 반올림 단계를 적용 할 것 이상한 것을 구현 이유 몇 가지 간단한의 시도 후에는 스포트 라이트 디스플레이와 같은 10 개 중요한 1 아래 번호 숫자와 1 위 그러나에 숫자 11을 보인다 내부 계산 대신 후?
Édouard

1
또한 Spotlight에보다 정확한 근사값 pi / 2 (예 : Wolfram Alpha에서 10 자리 이상을 복사하여 붙여 넣기)를 제공하면 정밀도가 증가한다는 점을 지적하고 싶습니다.
Édouard

OP의 질문에서 pi의 정밀도가 0에서 대략 10 ^ -12 사이의 오류의 원인이라는 내 추측을 확인해 주셔서 감사합니다.
bmike

"10 ^ -12는 정말 큽니다"
GEdgar

2

그 고려 -5e-12verryyyy 적은 수있다, 이것은 이다 반올림 오류입니다.

나는 그것이 pi삼각 함수를 계산하는 데 사용되는 상수 또는 무한 시리즈 의 정의에 사용되는 것보다 많은 소수점을 보여주는 스포트라이트의 결과라고 생각합니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.