-
19-09-2019 - |
题
是否有fractions.Fraction
的纯Python实现支持long
s作为分子和分母?不幸的是,取幂似乎是编码在返回一个浮子(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))
结果在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_
其给出了答案4.08569925773896097019795484811E-516。
我仍然有兴趣,如果有这样做没有额外的功能,更好的办法(我猜,如果我与Fraction
类足够的工作,我会找到工作的方式进入我的结果其他彩车)。
解决方案
“提高到电源”还没有结束的有理数的闭合操作(不同于通常的四次运算):没有有理数r
使得r == 2 ** 0.5
。相传毕达哥拉斯(从其定理这一事实,所以干脆如下)有他的弟子希帕索斯杀害证明这一点的可怕的罪行;貌似同情你的智慧毕达哥拉斯所涉嫌的反应;-),给您的怪异使用‘应该’。
Python的馏分意味着是精确的,因此不可避免地有情况,其中提高的馏分到另一部分的功率将是绝对的无法返回一个分数作为其结果;和“应该”只是不能合理地应用到数学不可能的。
所以你能做的最好的就是近似的你想要的结果,例如通过得到的结果,这不是一个确切的分数(浮点通常被认为足以达到目的),然后进一步近似回用一小部分。大多数现有的纯Python实现(有许多的发现rationals.py
文件绕过球网;-)宁愿不实行**
运营商所有,但当然没有什么作出不同的设计决定阻止你自己的实现 - !)
其他提示
您可以写不使用浮点幂馏分自己的“战俘”的功能。那是什么你想怎么办?
这将提高一小部分的整数次幂与落回浮动。
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 )