Domanda

Quando scrivo questo in Visual Studio 2008 finestra immediata:

? .9 - .8999999999999995

Mi dà questo come la risposta:

0.00000000000000055511151231257827

La documentazione dice che un doppio ha 15-16 cifre di precisione, ma mi sta dando un risultato con 32 cifre di precisione. Dove si trova tutto ciò che di precisione in più provenienti da?

È stato utile?

Soluzione

sono solo 15-16 cifre nella risposta. Tutti quegli zeri non contano. Il numero è in realtà più simile 5,5511151231257827 × 10 -16 . La porzione mantissa ha 15-16 cifre in esso. L'esponente (-16) serve per spostare il punto decimale sopra da 16 posti, ma non cambia il numero di cifre del numero complessivo.

Modifica

Dopo aver ottenuto alcuni commenti, sono curioso ora su ciò che sta realmente accadendo. Ho inserito il numero in questione in questo IEEE-754 Converter . Ha preso la libertà di arrotondamento l'ultimo "27" in "30", ma non credo che cambia i risultati.

Il convertitore scompone il numero nelle sue tre parti binarie:

Segno: 0 (positivo)
Esponente: -51
Significando: 1.0100000000000000000000000000000000000000000000000000 (binario per 1,25 10 )

Quindi questo numero è 1,01 2 × 2 -51 , o 1,25 10 × 2 -51 . Dal momento che ci sono solo tre cifre binarie significative immagazzinati, che suggerirebbe che Lars possa essere su qualcosa. Non possono essere "rumore casuale" dal momento che sono gli stessi ogni volta che il numero viene convertita.

I dati suggeriscono che l'unica cifra memorizzata è "5". Gli zeri iniziali provengono da l'esponente e il resto delle cifre apparentemente casuali sono da calcolare 2 -51 .

Altri suggerimenti

Si dovrebbe leggere: Ciò che ogni Computer Scientist Should Sapere su aritmetica alla virgola mobile .

In sostanza si tratta di numeri in virgola mobile di essere memorizzati con precisione finita. Devi fare il vostro confronto con alcuni delta.

if(.9 - .8999999999999995 <= 0.0001)
  //close enough to be equal

Gli zeri non sono significativi / parte della precisione (fino al numero in virgola mobile è interessato - matematicamente parlando, sono significativo). Gli zeri iniziali sono dovute alla parte esponente della rappresentazione interna del numero decimale.

La porzione 55511151231257827 (che è il significando o mantissa ) ha 17 cifre decimali, che è abbastanza vicino a 15-16 cifre.

@ Lars D: Cosa si pensa di essere corretto, è solo corretta nel contesto della questione. .9 - .8999999999999995 funziona a un galleggiante con significando 0,625 e esponente -50. Prendendo 0.625 * 2 -50 risultati in 5.5511151231257827e-16. Ora, fuori dal contesto della domanda iniziale, abbiamo un numero di 17 cifre significative che non capita di essere la nostra migliore approssimazione binario di 0,0000000000000005. Tuttavia, tali zeri iniziali non sono ancora significativo per quanto riguarda la rappresentazione del numero decimale è interessato.

  

? ,9-,8999999999999995

Questo processo di sottrazione, con 15-16 cifre significative, dà

  

,0000000000000005

Il resto delle cifre sono solo errori di arrotondamento. Tuttavia, dal momento che il computer memorizza sempre 15-16 cifre significative dopo il primo non-zero cifre, gli errori di arrotondamento sono mostrati, e si ottiene un sacco di ultimi numeri casuali generati dal errori di arrotondamento. Così il risultato ha 16 cifre significative dalla operazione di sottrazione più 16 cifre dalla memoria del risultato, che dà 32 cifre.

La parte "fluttuante" di "virgola mobile" significa che si stanno ottenendo qualcosa di più vicino a 5,5511151231257827 * 10 ^ (- 16). Questo non è esattamente come è rappresentato, perché naturalmente è tutto fatto in binario sotto il cofano, ma il punto è, il numero è rappresentato dalle cifre significative, più un numero che rappresenta la distanza per spostare la radice (punto decimale). Come sempre, wikipedia può dare maggiori dettagli:

(Il secondo collegamento è più specificamente focalizzata sul vostro caso particolare.)

Credo che la sua causa nel sistema binario, 5 è periodica in quanto non è divisibile per 2. E poi quello che Mark Rushakoff detto si applica.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top