gpt4 book ai didi

python - numpy 排列 : how to make "precise" array of floats?

转载 作者:太空宇宙 更新时间:2023-11-03 15:50:21 25 4
gpt4 key购买 nike

简而言之,我遇到的问题是这样的:

aa = np.arange(-1., 0.001, 0.01)
aa[-1]
Out[16]: 8.8817841970012523e-16

实际上,这会导致一系列问题,因为我的模拟不允许输入正值。

我可以通过以下方式解决问题:

aa = np.arange(-100, 1, 1)/100.
aa[-1]
Out[21]: 0.0

但这很痛苦。实际上你不能每次都这样做。

这似乎是一个基本问题。这里一定有我想念的东西。顺便说一下,我使用的是 Python 2.7.13。

最佳答案

发生这种情况是因为 Python(与大多数现代编程语言一样)使用浮点运算,它不能准确表示某些数字(参见 Is floating point math broken?)。

这意味着,无论您使用的是 Python 2、Python 3、R、C、Java 等,您都必须考虑将两个 float 相加的效果。

np.arange 通过将 step 值重复添加到 start 值来工作,这最终导致不精确:

>>> start = -1
>>> for i in range(1000):
... start += 0.001
>>> start
8.81239525796218e-16

类似地:

>>> x = np.arange(-1., 0.001, 0.01)
>>> x[-1]
8.8817841970012523e-16

用于规避此问题的典型模式是,如果需要重复操作,则尽可能使用整数。因此,例如,我会做这样的事情:

>>> x = 0.01 * np.arange(-100, 0.1)
>>> x[-1]
0.0

或者,您可以创建一个单行的便捷函数来为您执行此操作:

>>> def safe_arange(start, stop, step):
... return step * np.arange(start / step, stop / step)

>>> x = safe_arange(-1, 0.001, 0.01)
>>> x[-1]
0

但请注意,即使这样也无法绕过浮点精度的限制;例如,数字 -0.99 无法用 float 表示:

>>> val = -0.99
>>> print('{0:.20f}'.format(val))
-0.98999999999999999112

因此,在使用任何语言处理 float 时,您必须始终牢记这一点。

关于python - numpy 排列 : how to make "precise" array of floats?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47243190/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com