我陷入了一个奇怪的情况。我尝试了Pyson发布的三个解决方案中的任何一个:Increment a python floating point value by the smallest possible amount。当我降落在这个浮点上时,所有三种解决方案都显示出奇怪的行为:1.15898324042702949299155079643242061138153076171875。
假设我有以下代码:
import numpy as np
from __future__ import division
a = 1.15898324042702949299155079643242061138153076171875
b = 0
b = np.nextafter(a,1)
print a, b
出于某种原因,不是将b
递增到可能的最小量,而是递减。
那是为什么?
以下是我从游戏中获得的一些快速结果:
In [12]: a = 1.15898324042702949299155079643242061138153076171875
In [13]: a
Out[13]: 1.1589832404270295
In [14]: numpy.nextafter(a,1)
Out[14]: 1.1589832404270293
In [15]: numpy.nextafter(a,-1)
Out[15]: 1.1589832404270293
答案 0 :(得分:11)
从文档(强调我的):
nextafter(x1, x2[, out])
Return the next representable floating-point value after x1 **in the direction
of x2 element-wise**.
第二个参数不是+/- 1给出的方向,而是瞄准的价值。
In [12]: a = 1.15898324042702949299155079643242061138153076171875
In [13]: a
Out[13]: 1.1589832404270295
In [14]: numpy.nextafter(a, 0)
Out[14]: 1.1589832404270293
In [15]: numpy.nextafter(a, 1)
Out[15]: 1.1589832404270293
In [16]: numpy.nextafter(a, 1.16)
Out[16]: 1.1589832404270297
In [17]: numpy.nextafter(a, 2)
Out[17]: 1.1589832404270297