Recentemente, un corrispondente menzionato float.as_integer_ratio()
, nuovo in Python 2.6, osservando che le tipiche implementazioni in virgola mobile sono approssimazioni essenzialmente razionali dei numeri reali. Incuriosito, ho dovuto provare π:Limitazioni di implementazione di float.as_integer_ratio()
>>> float.as_integer_ratio(math.pi);
(884279719003555L, 281474976710656L)
sono rimasto un po 'sorpreso di non vedere più accurate risultato a causa di Arima,:
(428224593349304L, 136308121570117L)
Ad esempio, questo codice:
#! /usr/bin/env python
from decimal import *
getcontext().prec = 36
print "python: ",Decimal(884279719003555)/Decimal(281474976710656)
print "Arima: ",Decimal(428224593349304)/Decimal(136308121570117)
print "Wiki: 3.14159265358979323846264338327950288"
produce questa uscita:
python: 3.14159265358979311599796346854418516 Arima: 3.14159265358979323846264338327569743 Wiki: 3.14159265358979323846264338327950288
Certo, il risultato è corretto data la precisione offerta dai numeri a virgola mobile a 64 bit, ma mi porta a chiedere: come posso scoprire di più sui limiti di implementazione di as_integer_ratio()
? Grazie per qualsiasi consiglio.
Link aggiuntivi: Stern-Brocot tree e Python source.
La risposta accettata è fuorviante. Il metodo 'as_integer_ratio' restituisce il numeratore e il denominatore di una frazione il cui valore _exactly_ corrisponde al valore del numero a virgola mobile passato ad esso. Se vuoi una rappresentazione perfettamente accurata del tuo float come frazione, usa 'as_integer_ratio'. Se vuoi una _approximation_ semplificata con denominatore e numeratore più piccoli, guarda in fractions.Fraction.limit_denominator'. IOW, 'math.pi' è un'approssimazione di π. Ma '884279719003555/281474976710656' è _non_ un'approssimazione a' math.pi'; è esattamente _ uguale a questo. –
@ Mark Dickinson: il tuo punto è ben preso; chiarisce questa [risposta correlata] (https://stackoverflow.com/a/2076903/230513). Anche se la [risposta accettata] (https://stackoverflow.com/a/2076296/230513) potrebbe richiedere un po 'di manutenzione, mi ha aiutato a vedere dove il mio pensiero era andato storto. – trashgod