如何防止多个小数的“溢出”?

时间:2019-11-09 18:09:41

标签: python-3.x

我有一个包含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

这是一个问题,也许是溢出?! 我尝试了什么?

  1. 我试图循环执行此操作=>非常糟糕 运行时间,没有用

输入:

prod = 1
for i in A):
    prod = prod * A
     

输出:

     

0.0

  1. 我试图按数量排序,然后从数组中始终乘以第一个和最后一个,然后第二个和倒数第二个,第三个和第三个倒数,...。 =>以太没有工作 输入:
prod = 1
A.sort()
for i in range(len(A)):
    prod = prod * (A[i]*A[-i-1])

输出:

  

0.0

有人知道如何解决这个问题吗?

最好的问候 基督徒

1 个答案:

答案 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