Jak być może wiesz, Spotlight potrafi wykonywać proste zadania matematyczne. Na przykład pisanie cos(pi)
spowoduje -1
, jak można się spodziewać. Właśnie wpisałem cos(pi/2)
, co powinno być 0, ale dało mi to -5e-12
.
Tak, jest to prawdopodobnie ze względu na zaokrąglenia błędów, ale daj spokój: cos(pi/2)
! Moim zdaniem to wygląda jak błąd. Co myślisz?
pi
sam byłby zakodowany na stałe (gdy dostajesz -1 zacos(pi)
), ale jak tylko nim manipulujesz, otrzymujesz liczbę zmiennoprzecinkową, która ma ograniczoną precyzję. OSX nie twarde kodpi/2
,pi/4
etc, to rzeczywiście robi operacja.0.1
dokładnie reprezentować . dokładnie, ale nie jest to przydatne w przypadku liczb niewymiernych, takich jak pi, których nie można dokładnie przedstawić w postaci binarnej ani dziesiętnej.irb(main):009:0> Math.cos(Math::PI/2) => 6.123233995736766e-17
Odpowiedzi:
Wynika to z braku precyzji pi oraz z ogólnego braku precyzji we wbudowanym systemie.
O ogólnej precyzji systemu:
W Pythonie otrzymujemy:
Jak widzimy, istnieje problem z precyzją, ponieważ nie jest on nawet zgodny z reprezentacją zmiennoprzecinkową.
źródło
Nie przechowują π z niezwykłą precyzją zmiennoprzecinkową. Używają niepoprawnej wartości π z podwójną precyzją. Aby w przybliżeniu 3.1415926536 binarnie, wymagane jest co najmniej 38 bitów:
Zauważ, że 2 ^ -36 wynosi około 1,5e-11, co pokrywa się z końcową liczbą 99. Zmienna zmiennoprzecinkowa podwójnej precyzji ma znaczenie 52-bitowe. Aby ocenić
cos(pi/2)
jako -5e-12, jedynym innym możliwym wyborem byłby typ 48-bitowy, co byłoby bardzo dziwne.Blisko 0 i π, gdzie pochodna wynosi prawie zero, cos (θ) nie może być obliczone bardzo dokładnie:
cos(3.1415926536) ≈ -0.999999999999999999999947911
Różni się to od -1 o około 5,2e-23, co jest mniejsze niż ε dla
double
, więccos(3.1415926536)
jest obliczane jako dokładnie -1 ... co jest niepoprawne.W pobliżu ± π / 2 pochodna [ -sin (θ) ] wynosi prawie ± 1, więc błąd na wejściu staje się wyjściem.
cos(π/2)
Zdarza mi się mieć kalkulator TI, który wyświetla jedną cyfrę mniej i oblicza jako -5,2e-12. Jest jednak zupełnie inny pod względem elektronicznym i został zaprojektowany w celu podania dokładnej wartościcos(90°)
.Domyślam się, że w Spotlight
cos(pi/2)
jest obliczany przez pobranie wartości π, konwersję do ciągu dziesiętnego , przechowywanie go jako (dokładnej, wymiernej) wartości binarnej 11.00100100001111110110101010001000100100001101101111 (lub 10000), dzielenie przez 2, a następnie odejmowanie tego od prawdziwa wartość od p / 2. Powinieneś dowiedzieć się, czycos(pi/2 + cos(pi/2))
jest bliżej zera (może to być -2,2e-35).Mnożenie przez potęgę dwóch powinno wpływać tylko na wykładnik, a nie na znaczenie. Możliwe jest określenie, w jaki sposób stosuje się zaokrąglanie, poprzez powtarzanie o połowę lub podwojenie.
źródło
Jest to błąd, który można odtworzyć w 10.9.2 - a błąd zaokrąglania zmiennoprzecinkowego taki jak ten jest dość typowy.
To wartość pi jest obsługiwana bez wystarczającej precyzji, gdybym musiał zgadywać.
Chciałbym wejść na https://developer.apple.com/bug-reporting/, jeśli chcesz zobaczyć, jak działa aparat naprawiający błędy Apple.
źródło
cos(2*acos(0)*0.5)
zwraca liczbę zamówień10^-10
. Nie dzieje się tak dlatego, że stała π nie jest wystarczająco precyzyjna. Nie potrafię wyjaśnić tego wyniku: jest zbyt nieprecyzyjny dla podwójnej precyzji i zbyt precyzyjny dla pojedynczej precyzji.Z pozostałych odpowiedzi i komentarzy wynika, że:
Fakt, że otrzymasz niezerowy wynik, NIE jest błędem, nawet przy doskonałej implementacji oprogramowania wpadłbyś w granice obliczeń zmiennoprzecinkowych. Jednak błąd rzędu 10 ^ -12 jest naprawdę duży.
NIE jest to winą niedokładności liczb zmiennoprzecinkowych. Otrzymany wynik jest następujący:
Można to sprawdzić za pomocą dowolnego alternatywnego pakietu oprogramowania. Jeśli oceniasz
cos(pi/2)
w jednym z tych pakietów, na pewno uzyskasz wynik znacznie bliższy zeru niż 10 ^ -12.Podsumowując, widzę dwa możliwe ograniczenia, z których jedno musi mieć zastosowanie:
Być może ktoś z dostępem do oprogramowania może sprawdzić, które z nich ma zastosowanie.
Aktualizacja Jak wspomniano w komentarzu, problemem wydaje się być dokładność stałej
pi
.źródło
Biorąc pod uwagę, że
-5e-12
jest to bardzo mała liczba, jest to błąd zaokrąglania.Myślę, że jest to konsekwencja pokazania większej liczby miejsc po przecinku niż w definicji
pi
stałej lub nieskończonej serii użytej do obliczenia funkcji trig.źródło