python中大量数字的总和产生最大参数

Posted

技术标签:

【中文标题】python中大量数字的总和产生最大参数【英文标题】:Summation of large numbers in python yields the maximal parameter 【发布时间】:2017-07-24 10:36:03 【问题描述】:

在我的程序中,我使用 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】:

你可以使用the decimal standard library:

from decimal import Decimal

a = Decimal(1.57171938e+81)
b = Decimal(1.60451506e+56)
d = a + b
print(d)
print(d > a and d > b)

输出:

1.571719379999999945626903708E+81
True

您可以在之后将其转换回浮点数,但这会导致与之前相同的问题。

f = float(d)
print(f)
print(f > a and f > b)

输出:

1.57171938e+81
False

请注意,如果您将Decimals 存储在您的numpy 数组中,您将失去快速矢量化操作,如numpy does not recognize Decimal objects。虽然它确实有效:

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

【讨论】:

您仍然首先将数字转换为 64 位浮点近似值,然后将这些近似值转换为十进制。要将输入直接转换为十进制,请将它们作为字符串,a = Decimal("1.57171938e+81")b = Decimal("1.60451506e+56") 然后a+b 给出更正确的结果Decimal('1.571719380000000000000000160E+81')【参考方案2】:

1.57171938e+81 是一个 81 位数字,您只需输入前 9 个数字。1.60451506e+56 是一个小得多的数字,只有 56 位数字。

你期待什么样的答案?第一个完全使第二个相形见绌。如果您想要与原始数字具有相似精度的东西(这就是您使用浮点数得到的),那么答案就是正确的。

你可以使用整数:

>>> a = int(1.57171938e+81)
>>> b = int(1.60451506e+56)
>>> a
571719379999999945626903548020224083024251666384876684446269499489505292916359168L
>>> b
160451506000000001855754747064077065047170486040598151168L
>>> a+b
1571719379999999945626903708471730083024253522139623748523334546659991333514510336L

但这有多大用处取决于你。

【讨论】:

【参考方案3】:

这似乎是近似的问题:

>>> 1.57171938e+81 + 1.60451506e+65 > 1.57171938e+81
<<< True

>>> 1.57171938e+81 + 1.60451506e+64 > 1.57171938e+81
<<< False

你可以通过转换为 int 来解决这个问题:

>>> int(1.57171938e+81) + int(1.60451506e+64) > int(1.57171938e+81)
<<< True

【讨论】:

long 演员表在 Python 3.x 中不起作用。转换为 int 确实可以在那里工作,我相信这也适用于 Python 2.x。 int 确认在 Python 2.7 中为此目的工作 哦,我不知道int 在这种情况下有效,我会编辑我的答案,谢谢。

以上是关于python中大量数字的总和产生最大参数的主要内容,如果未能解决你的问题,请参考以下文章

参数总和[重复]

Bash 参数的最大数量!= max num cp 参数?

python 产生Bingo表格的程式,里面的数字是乱数,预设一页产生12个表格,结果会输出为PDF。参数是要产生的页数,输出档案会在当前目录下的bingo.pdf

如何手动实现在python中添加整数的函数重载?

python中怎么设置随机产生数字

Python - 在数字列表中查找最大数字