2012-09-06 6 views
6

Dopo aver inseritoPerché la funzione Decimale di Python è impostata su 54 posti?

from decimal import * 
getcontext().prec = 6 
Decimal (1)/Decimal (7) 

ottengo il valore

Decimal('0.142857') 

Tuttavia se entro Decimal (1.0/7) ottengo

Decimal('0.142857142857142849212692681248881854116916656494140625') 
+2

nota che indica una '0.1428571428571428' le cifre rimanenti non sono corretti –

risposta

12

Il 1.0/7 calcola un numero binario in virgola mobile a 17 cifre precisione. Questo accade prima il costruttore decimale vede:

>>> d = 1.0/7 
>>> type(d) 
<type 'float'> 
>>> d.as_integer_ratio() 
(2573485501354569, 18014398509481984) 

La frazione binaria, 2573485501354569/18014398509481984 è il più vicino binario in virgola mobile può ottenere usando 53 bit di precisione. Non è esattamente 1/7, ma è piuttosto vicino.

Il costruttore decimale quindi converte la frazione binaria in tutte le posizioni necessarie per ottenere un equivalente decimale esatto. Il risultato che stai vedendo è quello che si ottiene quando si valuta 2573485501354569/18014398509481984 esattamente:

>>> from decimal import Decimal, getcontext 
>>> getcontext().prec = 100 
>>> Decimal(2573485501354569)/Decimal(18014398509481984) 
Decimal('0.142857142857142849212692681248881854116916656494140625') 

punto Learning 1: binario in virgola mobile calcola frazioni binarie a 53 bit di precisione. Il risultato è arrotondato se necessario.

apprendimento punto 2: Ladecimale costruttore converte i numeri in virgola mobile binari a decimali losslessly (senza arrotondamento). Ciò tende a generare molte più cifre di precisione di quanto ci si potrebbe aspettare (vedere la sesta domanda nello Decimal FAQ).

punto apprendimento 3: Il modulo decimale è stato progettato per il trattamento di tutti i numeri come esatto. Solo i risultati dei calcoli vengono arrotondati alla precisione del contesto. L'input in virgola mobile binario viene convertito in decimale esattamente e la precisione del contesto non viene applicata fino a quando non si esegue un calcolo con il numero (consultare la domanda e la risposta finali in Domande frequenti sui decimali per i dettagli).

Riepilogo: Non eseguire la divisione in virgola mobile binario prima di passare i numeri al modulo decimale. Lascia che faccia il lavoro alla tua precisione desiderata.

Spero che questo aiuti :-)

+0

Grande risposta, bene che hanno risposto a questa domanda. Sto cancellando il mio, poiché ora sembra infelice;) +1 – Tadeck

Problemi correlati