具有小数精度的分数

时间:2010-01-10 23:47:04

标签: python decimal long-integer arbitrary-precision

是否有fractions.Fraction的纯python实现支持long作为分子和分母?不幸的是,取幂似乎被编码为返回一个浮点数(确认!!!),这至少应该支持使用decimal.Decimal

如果没有,我想我可以制作一个库的副本,并尝试用float()中适当的东西替换Decimal的出现,但我宁愿通过以前的其他人。

这是一个代码示例:

base = Fraction.from_decimal(Decimal(1).exp())
a = Fraction(69885L, 53L)
x = Fraction(9L, 10L)

print base**(-a*x), type(base**(-a*x))

结果为0.0 <type 'float'>,答案应该是一个非常小的小数。

更新:我现在有以下解决方法(假设,对于** b,两者都是分数;当然,当exp_是a时我还需要另一个函数浮动或本身是十进制的):

def fracpow(base, exp_):
    base = Decimal(base.numerator)/Decimal(base.denominator)
    exp_ = Decimal(exp_.numerator)/Decimal(exp_.denominator)

    return base**exp_

给出答案4.08569925773896097019795484811E-516。

如果没有额外的功能有更好的方法,我仍然会感兴趣(我猜我是否足够使用Fraction课程,我会发现其他花车进入我的结果)。

2 个答案:

答案 0 :(得分:6)

“提升到权力”不是对有理数的封闭操作(与通常的四个算术运算不同):没有理性数r使得r == 2 ** 0.5。传说毕达哥拉斯(他的定理这个事实如此简单地跟随)让他的弟子希帕苏斯因为证明这一点的可怕罪行而被杀害;看起来你很同情毕达哥拉斯所谓的反应;-),鉴于你对“应该”的奇怪使用。

Python的分数是准确的,因此不可避免地存在这样的情况:将分数提高到另一分数的幂将绝对无法返回分数作为其结果;并且“应该”不能合理地应用于数学上的不可能性。

因此,您可以做的最好的事情是近似您想要的结果,例如通过得到一个不是精确分数的结果(浮动通常被认为足够用于此目的),然后用一个分数进一步逼近它。大多数现有的纯Python实现(在网络上找到许多 rationals.py文件;-)根本不想实现**运算符,但当然没有什么停止你在自己的实现中做出不同的设计决定! - )

答案 1 :(得分:0)

您可以为不使用浮点取幂的分数编写自己的“pow”函数。那是你想要做的吗?

这会将一小部分提升到整数幂,然后再回到浮动状态。

def pow( fract, exp ):
    if exp == 0: 
        return fract
    elif exp % 2 == 0:
        t = pow( fract, exp//2 )
        return t*t
    else:
        return fract*pos( fract, exp-1 )
相关问题