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

8

Come forse sapete, Spotlight può fare semplici matematica. Ad esempio, digitando cos(pi) otterrai -1 , come potresti aspettarti. Ho appena inserito cos(pi/2) , che dovrebbe essere 0 ma mi ha dato -5e-12 .

Sì, probabilmente è a causa di un errore di arrotondamento, ma dai: cos(pi/2) ! A mio parere, sembra chiaramente un insetto. Cosa ne pensi?

    
posta poitroae 11.03.2014 - 21:39
fonte

5 risposte

13

È dovuto alla mancanza di precisione di 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 generale del sistema:

3.141592653589793238462643383 = 3.1415926536 

In Python seguiamo:

>>> float("3.141592653589793238462643383")
3.141592653589793

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

    
risposta data 11.03.2014 - 21:45
fonte
5

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

3.14159265359922… > 11.001001000011111101101010100010001001

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

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

cos(3.1415926536) ≈ -0.999999999999999999999947911

Questo differisce da -1 per circa 5,2e-23, che è minore di ε per double , quindi cos(3.1415926536) è calcolato come esattamente -1 ... che non è corretto.

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

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 dal punto di vista elettronico ed è stato progettato per fornire un valore esatto per cos(90°) .

Direi che in Spotlight, cos(pi/2) viene calcolato recuperando un valore per π, convertendo in una stringa decimale , memorizzandolo come valore binario (esatto, razionale) 11.00100100001111110110101010001000100100001101101111 (o 10000), dividendo per 2, e quindi essenzialmente sottraendo quello dal valore reale di π / 2. Dovresti scoprire se cos(pi/2 + cos(pi/2)) è più vicino a zero (potrebbe essere -2.2e-35).

La moltiplicazione per potenza di due dovrebbe influenzare solo l'esponente, non il significato e. Potrebbe essere possibile determinare come viene applicato l'arrotondamento mediante dimezzamento o raddoppio ripetuto.

    
risposta data 12.03.2014 - 20:42
fonte
4

È un bug riproducibile su 10.9.2 - e un errore di arrotondamento a virgola mobile simile è piuttosto tipico.

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

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

Mi piacerebbe andare al link se vuoi vedere in azione l'apparato per riparare i bug di Apple.

    
risposta data 11.03.2014 - 21:46
fonte
4

Dalle altre risposte e commenti diventa chiaro:

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

Questo NON è colpa dell'accuratezza dei numeri in virgola mobile. Il risultato che ottieni è proprio questo:

cos(1.5707963268)

Ciò può essere convalidato utilizzando qualsiasi pacchetto software alternativo. Se dovessi valutare cos(pi/2) in uno di questi 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 risulta in una precisione insufficiente
  2. Cos prende semplicemente una precisione insufficiente come input

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

Aggiorna Come menzionato nel commento, il problema sembra essere la precisione della costante pi .

    
risposta data 12.03.2014 - 10:44
fonte
2

Considerando che -5e-12 è un numero piccolo verryyyy, questo è un errore di arrotondamento.

Penso che sia la conseguenza di spotlight che mostra più decimali che non utilizzati nella definizione della costante pi o della serie infinita utilizzata per calcolare le funzioni trigonometriche.

    
risposta data 11.03.2014 - 21:46
fonte

Leggi altre domande sui tag