python中的大数求和生成最大参数
在我的程序中,我使用numpy获得数字的指数,然后使用sum函数对它们进行汇总。 我注意到,不管是否使用numpy,汇总这些大的数字都会导致返回最大的参数,保持不变python中的大数求和生成最大参数,python,numpy,math,exponent,Python,Numpy,Math,Exponent,在我的程序中,我使用numpy获得数字的指数,然后使用sum函数对它们进行汇总。 我注意到,不管是否使用numpy,汇总这些大的数字都会导致返回最大的参数,保持不变 exp_joint_probabilities=[ 1.57171938e+81, 1.60451506e+56, 1.00000000e+00] exp_joint_probabilities.sum() => 1.571719381352921e+81 仅python也是如此: (1.57171938e+81+
exp_joint_probabilities=[ 1.57171938e+81, 1.60451506e+56, 1.00000000e+00]
exp_joint_probabilities.sum()
=> 1.571719381352921e+81
仅python也是如此:
(1.57171938e+81+1.60451506e+56+1.00000000e+00)==1.57171938e+81
=>True
这是近似的问题吗?我应该使用更大的数据类型来表示数字吗?
如何才能获得此类计算的更准确结果?近似值似乎存在问题:
>>> 1.57171938e+81 + 1.60451506e+65 > 1.57171938e+81
<<< True
>>> 1.57171938e+81 + 1.60451506e+64 > 1.57171938e+81
<<< False
>>1.57171938e+81+1.60451506e+65>1.57171938e+81
>1.57171938e+81+1.60451506e+64>1.57171938e+81
>国际标准(1.57171938e+81)+国际标准(1.60451506e+64)>国际标准(1.57171938e+81)
1.57171938e+81
是一个包含81位数字的数字,您只需输入其中的前9位1.60451506e+56
是一个小得多的数字,只有56位
你期望得到什么样的答案?前者使后者相形见绌。如果您想要与原始数字具有类似的精度(这就是使用浮点数得到的结果),那么答案就是正确的
您可以使用ints:
>>> a = int(1.57171938e+81)
>>> b = int(1.60451506e+56)
>>> a
571719379999999945626903548020224083024251666384876684446269499489505292916359168L
>>> b
160451506000000001855754747064077065047170486040598151168L
>>> a+b
1571719379999999945626903708471730083024253522139623748523334546659991333514510336L
但这是否有用取决于您。您可以使用:
输出:
1.571719379999999945626903708E+81
True
1.57171938e+81
False
1.571719379999999945626903708E+81
True
之后可以将其转换回浮点,但这将导致与以前相同的问题
f = float(d)
print(f)
print(f > a and f > b)
输出:
1.571719379999999945626903708E+81
True
1.57171938e+81
False
1.571719379999999945626903708E+81
True
请注意,如果在numpy
数组中存储Decimal
s,则会丢失快速矢量化操作,如下所示。尽管它确实有效:
import numpy as np
a = np.array([1.57171938e+81, 1.60451506e+56, 1.00000000e+00])
d = np.vectorize(Decimal)(a) # convert values to Decimal
print(d.sum())
print(d.sum() > d[0]
输出:
1.571719379999999945626903708E+81
True
1.57171938e+81
False
1.571719379999999945626903708E+81
True
long
cast在Python3.x中不起作用。强制转换到int
在那里确实有效,我相信在Python 2.x中也有效。int
在Python 2.7中已确认为此目的有效哦,我不知道int
在本例中有效,我将编辑我的答案,谢谢。您仍然需要先将数字转换为64位浮点近似值,然后再将这些近似值转换为十进制。要将输入直接转换为十进制,将其作为字符串给出,a=Decimal(“1.57171938e+81”)
和b=Decimal(“1.60451506e+56”)
然后a+b
给出更正确的结果Decimal(“1.5717193800000000000000000000160e+81”)