【问题标题】:Power of a decimal number producing OverflowError产生溢出错误的十进制数的幂
【发布时间】:2023-03-24 23:56:01
【问题描述】:

我有一个返回 log10 值的函数。在将它们转换为正常数字时,我得到一个溢出错误。

OverflowError: (34, '数值结果超出范围')

我检查了日志值,并且发生此错误,例如 508.038057662

我认为虽然python很容易执行10**509,但这个错误一定是由于小数点溢出寄存器。因此我尝试像这样使用 numpy.float64,

result = np.array([ (10**multiplicity(timeseries,om,ph,bins,pos_arr)) for ph in np.linspace(0,twopi,num = bins+1)], dtype = np.float64)

错误是一样的。我是否声明了 float64 错误??

这里 multiplicity() 是返回 log10 值的函数。我需要一个值的“列表”。

【问题讨论】:

  • 嗯 .... 10^509 > 2^64 ... 或者我在这里遗漏了一些明显的东西?
  • 10**509 = 100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000L 使用 Python
  • 是的,但正如下面的回答者所说,这是long 类型,而不是float64 类型。您可能会注意到,该数据类型最多只能容纳 64 位长的数字。
  • 64 位浮点数可以表示比 264 大很多的数字(只是不是该范围内的所有整数!),但远不及 10509。
  • 是的。很高兴能更好地了解基本原理...

标签: python numpy


【解决方案1】:

我认为虽然python很容易执行10**509,但这个错误一定是由于小数点溢出寄存器。

问题不在于“小数点溢出”,而是由您使用的数据类型引起的。

Python 可以愉快地将 10**509 计算为 long,因为 these have unlimited precision

>>> type(10**509)
<type 'long'>

但是,此结果太大而无法存储在 float 中:

>>> float(10**509)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OverflowError: long int too large to convert to float

我们可以很容易地检查float的最大值:

>>> import sys
>>> sys.float_info.max
1.7976931348623157e+308

查看 this question 似乎 Numpy float64 具有与标准 float 相同的值范围,因此使用它并不能解决您的问题。

相反,您必须使用提供任意精度浮点的第三方模块之一,例如 mpmathbigfloat

【讨论】:

  • 好吧好吧。那么有没有办法将我的浮点数转换为长呢?还是我必须使用 bigfloat 或 mpmath?哦,长不考虑小数仪式?
  • long 用于整数。所以10**508 会很好,但10**508.5 不会。所以我认为如果你真的需要处理这么大的浮点数,你会被 bigfloat 或 mpmath 困住。
  • GMPy 是您参加第 3 方时应该考虑的因素。
  • 您打算如何处理“未记录”值?我会尽可能长时间地将它们保留为对数(酌情转换其他算术步骤)。
  • @KarlKnechtel 我需要整合正常值。使用对数项的斯特林近似会导致出现一定范围的错误。随着 Bigfloat 的出色工作,我可以获得完美的准确性。谢谢大家:)
猜你喜欢
  • 2012-08-22
  • 1970-01-01
  • 1970-01-01
  • 2017-11-01
  • 2012-02-19
  • 2019-08-25
  • 1970-01-01
  • 1970-01-01
  • 2021-09-28
相关资源
最近更新 更多