Perché Spotlight fornisce un valore errato per `cos (pi / 2)`?


8

Come forse saprai, Spotlight può fare matematica semplice. Ad esempio, la digitazione cos(pi)comporterà -1, come ci si potrebbe aspettare. Ho appena digitato cos(pi/2), che dovrebbe essere 0 ma mi ha dato -5e-12.

Sì, è probabilmente dovuto ad un errore di arrotondamento, ma dai: cos(pi/2)! Secondo me, sembra chiaramente un bug. Cosa ne pensi?


1
cos (x) è una funzione trascendentale. A meno che non codifichino valori per pi, pi / 2, ecc., Dovresti aspettarti un errore.
Navin,

@Navin in realtà mi aspetto che codifichino questi valori poiché sono molto importanti.
poitroae,

1
pistesso sarebbe codificato (man mano che ottieni -1 per cos(pi)) ma non appena lo manipoli otterrai un numero in virgola mobile, che ha una precisione limitata. OSX non codifica pi/2, pi/4ecc., In realtà esegue l'operazione.
harryg

2
@harryg Mentre ci sono errori di arrotondamento che possono essere risolti passando al decimale, questo non è uno di questi. Il decimale è utile se si desidera rappresentare 0.1esattamente. precisamente, ma non è utile per numeri irrazionali come pi che non possono essere rappresentati esattamente in binario o decimale.
Codici A Caos

1
Per riferimento, in Ruby:irb(main):009:0> Math.cos(Math::PI/2) => 6.123233995736766e-17
harryg

Risposte:


13

È dovuto alla mancanza di precisione del pi e alla totale mancanza di precisione nel sistema integrato.

pi = 3.1415926536

pi/2 = 1.5707963268 

cos(1.5707963268) = -5.103412e-12

FYI =  5.103412e-12 = 0.000000000005103412 ~ 0 


Informazioni sulla precisione complessiva del sistema:

3.141592653589793238462643383 = 3.1415926536 

In Python otteniamo quanto segue:

>>> float("3.141592653589793238462643383")
3.141592653589793

Come possiamo vedere c'è un problema con la precisione poiché non corrisponde nemmeno alla rappresentazione float.


È dovuto alla mancanza di precisione, ma un errore di questa entità non può essere annullato su numeri in virgola mobile.
Dennis Jaheruddin,

2
Probabilmente è più una mancanza di precisione con il valore pi.
Matthieu Riegler,

5

Non memorizzano π con insolita precisione in virgola mobile. Stanno usando un valore errato per π con doppia precisione. Per approssimare 3.1415926536 in binario, sono richiesti almeno 38 bit:

3.14159265359922… > 11.001001000011111101101010100010001001

Si noti che 2 ^ -36 è circa 1,5e-11, che coincide con il 99 finale. Il virgola mobile a precisione doppia ha un significato di 52 bit. Per valutare cos(pi/2)come -5e-12, l'unica altra scelta possibile sarebbe un tipo a 48 bit, il che sarebbe molto strano.

Vicino a 0 e π, dove la derivata è quasi zero, cos (θ) non può essere calcolato in modo molto preciso:

cos(3.1415926536) ≈ -0.999999999999999999999947911

Ciò differisce da -1 di circa 5,2e-23, che è più piccolo di ε per double, quindi cos(3.1415926536)viene calcolato esattamente come -1 ... che non è corretto.

Vicino a ± π / 2, la derivata [ -sin (θ) ] è quasi ± 1, quindi l'errore all'ingresso diventa l'uscita.

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

Mi capita di avere un calcolatore TI che visualizza una cifra in meno e calcola cos(π/2)come -5.2e-12. Tuttavia, è molto diverso elettronicamente ed è stato progettato per dare un valore esatto per cos(90°).

Immagino che in Spotlight cos(pi/2)venga calcolato recuperando un valore per π, convertendolo in una stringa decimale , memorizzandolo come valore binario (esatto, razionale) 11.00100100001111110110101010001000100100001101101111 (o 10000), dividendolo per 2, e quindi sottraendo essenzialmente da il vero valore di π / 2. Dovresti scoprire se cos(pi/2 + cos(pi/2))è più vicino a zero (potrebbe essere -2.2e-35).

La moltiplicazione per un potere di due dovrebbe influenzare solo l'esponente, non il significato. Potrebbe essere possibile determinare come viene applicato l'arrotondamento ripetendo il dimezzamento o il raddoppio.


Nulla è sbagliato nel Markdown: MathJax è abilitato solo su siti relativi alla matematica, non a livello di SE.
grg

1
cos (pi / 2 + cos (pi / 2)) viene visualizzato esattamente come 0.
Nick Matteo

4

È un bug riproducibile su 10.9.2 - e un errore di arrotondamento in virgola mobile come quello è abbastanza tipico.

È il valore di pi che viene gestito senza sufficiente precisione se dovessi indovinare.

  • cos (999999 * pi) non ha un errore
  • cos ((999999 + 1) * pi) presenta un errore - probabile arrotondamento

Andrei su https://developer.apple.com/bug-reporting/ se vuoi vedere in azione l'apparato per la correzione di bug di Apple.


5
È davvero un bug? Quale dovrebbe essere la precisione su tale operazione?
Édouard,

Non sono uno sviluppatore registrato, ma sarei molto grato se potessi inviarlo per noi!
poitroae,

4
@ Édouard Si potrebbe prendere in considerazione un bug, se l'utente è stato portato ad aspettare qualche capacità di matematica simbolica. Qualsiasi sistema di algebra del computer (CAS) ovviamente saprà che cos (π / 2) = 0 esattamente! D'altra parte, non è ragionevole aspettarsi che Spotlight contenga un CAS. E nel regno dell'aritmetica in virgola mobile, ci si aspettano risultati come i report OP. Qualsiasi segnalazione di bug potrebbe essere meglio etichettata come una richiesta di funzionalità, forse.
Harald Hanche-Olsen,

1
@ Édouard bmike ha infatti ragione nel dire che si tratta di un bug e non di un errore di arrotondamento. La precisione attesa di tale operazione, data l'aritmetica della doppia precisione standard, è circa 10 ^ -16, non 10 ^ -12. Puoi provarlo tu stesso scrivendo un programma nella tua lingua preferita che sfrutta il supporto in virgola mobile della CPU, facendo il calcolo ed esaminando il modello di bit del risultato. Come dice bmike, la probabile ragione è che il valore π che Spotlight utilizza non è definito con sufficiente precisione.
Szabolcs,

2
Qui sta succedendo qualcosa di strano. cos(2*acos(0)*0.5)restituisce un numero di ordine 10^-10. Quindi non è perché la costante π non è abbastanza precisa. Non riesco a spiegare questo risultato: è troppo impreciso per la doppia precisione e troppo preciso per la precisione singola.
Szabolcs,

4

Dalle altre risposte e commenti diventa chiaro:

Il fatto che si ottenga un risultato diverso da zero NON è un bug, anche con un'implementazione perfetta del software si verificherebbero i limiti dei calcoli in virgola mobile. Tuttavia, l'errore nell'ordine di 10 ^ -12 è davvero grande.

Questo NON è da attribuire alla inesattezza dei numeri in virgola mobile. Il risultato che ottieni è proprio questo:

cos(1.5707963268)

Che può essere convalidato utilizzando qualsiasi pacchetto software alternativo. Se dovessi valutare cos(pi/2)in uno di quei pacchetti otterrai sicuramente un risultato molto più vicino allo zero di 10 ^ -12.

Per concludere, vedo due possibili limitazioni, una delle quali deve essere applicata:

  1. Pi non viene memorizzato con sufficiente precisione, o almeno pi / 2 determina una precisione insufficiente
  2. Cos semplicemente richiede una precisione insufficiente come input

Forse qualcuno con accesso al software può convalidare quale di questi si applica.

Aggiornamento Come menzionato nel commento, il problema sembra essere l'accuratezza della costante pi.


Questo è strano. 1.5707963268 è il risultato che Spotlight ti dà quando calcoli pi / 2. Dopo alcuni semplici tentativi, sembra che Spotlight mostri 10 cifre significative per il numero inferiore a 1 e 11 per i numeri superiori a 1. Ma per quale strano motivo di implementazione si applicherebbe una fase di arrotondamento all'interno del calcolo anziché dopo?
Édouard,

1
Volevo anche sottolineare che se si fornisce a Spotlight un'approssimazione più precisa pi / 2 (copiando più di 10 cifre da Wolfram Alpha, ad esempio), la precisione aumenta.
Édouard,

Grazie per aver confermato la mia ipotesi che la precisione di pi fosse la causa dell'errore tra 0 e circa 10 ^ -12 nella domanda del PO.
bmike

Quante volte vedi questo: "10 ^ -12 è davvero grande"
GEdgar

2

Considerando che si -5e-12tratta di un piccolo numero verryyyy, si tratta di un errore di arrotondamento.

Penso che sia la conseguenza del riflettore che mostra più decimali di quelli utilizzati nella definizione della picostante o delle serie infinite utilizzate per calcolare le funzioni di trigge.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.