Недавно корреспондент упомянул float.as_integer_ratio()
, новость в Python 2.6, отметив, что типичные реализации с плавающей запятой - это по существу рациональные приближения действительных чисел.Заинтригованный, я должен был попробовать π:
>>> float.as_integer_ratio(math.pi);
(884279719003555L, 281474976710656L)
Я был слегка удивлен, не увидев более точный результат из-за Арима ,:
(428224593349304L, 136308121570117L)
Например, этот код:
#! /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"
производит такой вывод:
python: 3.14159265358979311599796346854418516
Arima: 3.14159265358979323846264338327569743
Wiki: 3.14159265358979323846264338327950288
Конечно, результат верен, учитывая точность, обеспечиваемую 64-битными числами с плавающей запятой, но это заставляет меня спросить: как я могу узнать больше об ограничениях реализации as_integer_ratio()
?Спасибо за любые рекомендации.
Дополнительные ссылки: Дерево Stern-Brocot и Источник Python .