Recientemente, un corresponsal mencionó float.as_integer_ratio()
, nuevo en Python 2.6, señalando que las implementaciones típicas de punto flotante son esencialmente aproximaciones racionales de números reales. Intrigado, que tenía que probar π:Limitaciones de implementación de float.as_integer_ratio()
>>> float.as_integer_ratio(math.pi);
(884279719003555L, 281474976710656L)
yo estaba un poco sorprendido de no ver más accurate resultado debido a Arima,:
(428224593349304L, 136308121570117L)
Por ejemplo, este código:
#! /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 esta salida:
python: 3.14159265358979311599796346854418516 Arima: 3.14159265358979323846264338327569743 Wiki: 3.14159265358979323846264338327950288
Sin duda, el resultado es correcto dada la precisión que brindan los números de coma flotante de 64 bits, pero me lleva a preguntar: ¿Cómo puedo obtener más información sobre las limitaciones de implementación de as_integer_ratio()
? Gracias por cualquier orientación.
Otros enlaces: Stern-Brocot tree y Python source.
La respuesta aceptada es engañosa. El método 'as_integer_ratio' devuelve el numerador y el denominador de una fracción cuyo valor _exactly_ coincide con el valor del número de coma flotante que se le pasa. Si desea una representación perfectamente precisa de su flotador como una fracción, use 'as_integer_ratio'. Si desea una _aproximación simplificada_ con un denominador y un numerador más pequeños, investigue 'fractions.Fraction.limit_denominator'. IOW, 'math.pi' es una aproximación a π. Pero '884279719003555/281474976710656' no es una aproximación a' math.pi'; es exactamente igual a eso. –
@MarkDickinson: Su punto está bien; aclara esta [respuesta relacionada] (https://stackoverflow.com/a/2076903/230513). Aunque la [respuesta aceptada] (https://stackoverflow.com/a/2076296/230513) podría usar algo de mantenimiento, me ayudó a ver dónde mi pensamiento había salido mal. – trashgod