>>>开始 = -1>>>对于我在范围内(1000):... 开始 += 0.001>>>开始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(开始,停止,步骤):... return step * np.arange(start/step, stop/step)>>>x = safe_arange(-1, 0.001, 0.01)>>>x[-1]0但请注意,即使这样也无法绕过浮点精度的限制;例如,数字 -0.99 不能用浮点数精确表示:>>>价值 = -0.99>>>打印('{0:.20f}'.format(val))-0.98999999999999999112因此,在使用任何语言处理浮点数时,您必须始终牢记这一点.In short, the problem I encounter is this:aa = np.arange(-1., 0.001, 0.01)aa[-1]Out[16]: 8.8817841970012523e-16In reality, this cause a series problem since my simulations doesn't allow positive value inputs.I can sort of get around by doing:aa = np.arange(-100, 1, 1)/100.aa[-1]Out[21]: 0.0But this is a pain. Practically you can't do this every time.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. 解决方案 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?).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 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>>> start8.81239525796218e-16Similarly:>>> x = np.arange(-1., 0.001, 0.01)>>> x[-1]8.8817841970012523e-16The 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.0Alternatively, 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]0But 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.98999999999999999112So you must always keep that in mind when working with floating point numbers, in any language. 这篇关于numpy arange:如何制作“精确"浮点数数组?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!
09-15 04:48