我有一个包含x个非常小的数字的列表,并希望创建它们的乘积。我只想使用纯Python或/和numpy。
# List A with x very small numbers
A =[1.20223398e-072 1.53678559e-067 6.04813112e-041 3.26046833e-104
3.09114525e-048 7.65394632e-118 4.58886892e-209 7.02220200e-044
3.40963578e-085 2.79721084e-060 6.99320974e-052 7.65701921e-039
3.05321642e-103 2.33360119e-050 2.92905105e-044 5.13970623e-044
6.46863409e-180 1.78254565e-177 6.26061488e-068 5.86281346e-043]
#creating the product of all elements in A
np.prod(A)
输出:
0.0
这是一个问题,也许是溢出?! 我尝试了什么?
输入:
prod = 1 for i in A): prod = prod * A
输出:
0.0
prod = 1 A.sort() for i in range(len(A)): prod = prod * (A[i]*A[-i-1])
输出:
0.0
有人知道如何解决这个问题吗?
最好的问候 基督徒
答案 0 :(得分:0)
基础浮点存储的容量不足以容纳这么小的数字,尤其是它们的乘积,乘积越大,乘积就变得越小。
WorldObject
但是,使用以下特定数字,该产品实际上适合>>> A[0]*A[1]
1.8475758562723483e-139
>>> A[0]*A[1]*A[2]
1.1174381032881437e-179
>>> A[0]*A[1]*A[2]*A[3]
3.6433715465062613e-283
>>> A[0]*A[1]*A[2]*A[3]*A[4]
0.0
类型:
np.float128
当然,这只是移动目标杆:将其他数字相乘可以再次为您提供零。
一种替代方法是在Python中使用>>> np.prod(A, dtype=np.float128)
6.439950307032109978e-1637
模块,这将为您提供最精确的数字处理方式。虽然它比IEEE浮动速度慢得多,但是应该可以工作:
decimal