Ограничения реализации float.as_integer_ratio ()
Недавно корреспондент упомянулfloat.as_integer_ratio()
, новый в Python 2.6, отмечая, что типичные реализации с плавающей точкой являются по существу рациональными приближениями действительных чисел. Заинтригованный, я должен был попробовать π:
>>> float.as_integer_ratio(math.pi);
(884279719003555L, 281474976710656L)
Я был слегка удивлен, чтобы не видеть большеточный результат из-заArima,:
(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()
? Спасибо за любое руководство.
Дополнительные ссылки:Стерн-Броко а такжеИсходник Python.