Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中的大数求和生成最大参数_Python_Numpy_Math_Exponent - Fatal编程技术网

python中的大数求和生成最大参数

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+

在我的程序中,我使用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+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”)