具有小数精度的分数

Noa*_*oah 6 python decimal arbitrary-precision long-integer

是否有一个纯粹的python实现fractions.Fraction支持longs作为分子和分母?不幸的是,取幂似乎被编码为返回浮点数(ack !!!),这应该至少支持使用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))
Run Code Online (Sandbox Code Playgroud)

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

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

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

    return base**exp_
Run Code Online (Sandbox Code Playgroud)

给出了答案4.08569925773896097019795484811E-516.

如果没有额外的功能有更好的方法,我仍然会感兴趣(我猜测如果我在Fraction课堂上工作得足够多,我会发现其他花车正在进入我的结果).

Ale*_*lli 6

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

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

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