是否有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
课程,我会发现其他花车进入我的结果)。
答案 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 )