Ограничения реализации плавания 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()? Спасибо за любое руководство.

Дополнительные ссылки: строгое-Brocot дерево и источник Python.

11
задан trashgod 9 February 2018 в 17:09
поделиться

3 ответа

В NetBeans переходят на инструменты > Параметры . Затем выберите вкладку вкладку и выберите Java под распадом языка.

Теперь есть несколько вариантов, чтобы изменить форматирование того, как вам это нравится.

-121--2306575-

Алгоритм, используемый AS_INTEGER_RATIO , только учитывает мощности 2 в знаменателе . Вот (вероятно) лучший алгоритм .

4
ответ дан 3 December 2019 в 09:20
поделиться

Вы получаете лучшие приближения с использованием фракций

fractions.Fraction.from_float(math.pi).limit_denominator()

fractions.Fraction.from_float(math.pi).limit_denominator()

, которые могут быть включены, возможно, версия 3.0. Тем не менее, Math.pi не имеет достаточно точности для возврата 30-значного приближения.

5
ответ дан 3 December 2019 в 09:20
поделиться

Могу ли я порекомендовать GMPY Реализация дерева дерева Стерна-Брокота :

>>> import gmpy
>>> import math
>>> gmpy.mpq(math.pi)
mpq(245850922,78256779)
>>> x=_
>>> float(x)
3.1415926535897931
>>> 

снова, результат «правильный в пределах прецизировки 64-битных поплавок» (53 -Bit "так называемые" мантиссы ;-), но:

>>> 245850922 + 78256779
324107701
>>> 884279719003555 + 281474976710656
1165754695714211L
>>> 428224593349304L + 136308121570117
564532714919421L

... точность GMPY достигается так много дешевле (с точки зрения суммы вычисления чисел и значений знаменателей), чем арима, гораздо меньше питона 2.6! -)

3
ответ дан 3 December 2019 в 09:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: