numpy arange:如何使“精确"数组的浮点数? [英] numpy arange: how to make "precise" array of floats?

查看:289
本文介绍了numpy arange:如何使“精确"数组的浮点数?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

In short, the problem I encounter is this:

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

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

In reality, this cause a series problem since my simulations doesn't allow positive value inputs.

我可以这样做:

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

但是这很痛苦.实际上,您不能每次都这样做.

But this is a pain. Practically you can't do this every time.

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

This seems like such a basic problem. There's gotta be something I am missing here. By the way, I am using Python 2.7.13.

推荐答案

之所以会发生这种情况,是因为Python(与大多数现代编程语言一样)使用浮点算术,而浮点算术无法精确表示某些数字(请参见

This happens because Python (like most modern programming languages) uses floating point arithmetic, which cannot exactly represent some numbers (see Is floating point math broken?).

这意味着,无论您是否使用Python 2,Python 3,R,C,Java等,都必须考虑将两个浮点数加在一起的效果.

This means that, regardless of whether you're using Python 2, Python 3, R, C, Java, etc. you have to think about the effects of adding two floating point numbers together.

np.arange的工作方式是将step值重复添加到start值,最终导致不精确:

np.arange works by repeatedly adding the step value to the start value, and this leads to imprecision in the end:

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

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

The typical pattern used to circumvent this is to work with integers whenever possible if repeated operations are needed. So, for example, I would do something like this:

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

或者,您可以创建一个单行便捷功能来为您完成此操作:

Alternatively, you could create a one-line convenience function that will do this for you:

>>> 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 不能完全以浮点数表示:

But note that even this can't get around the limits of floating point precision; for example, the number -0.99 cannot be represented exactly in floating point:

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

因此,在使用任何语言的浮点数时,必须始终牢记这一点.

So you must always keep that in mind when working with floating point numbers, in any language.

这篇关于numpy arange:如何使“精确"数组的浮点数?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆