2012-11-09 37 views
7

我倒在一个奇怪的情况下。我尝试了Pyson发布的三种解决方案中的任意一种:Increment a python floating point value by the smallest possible amount。当我登陆这个浮点时,所有这三个解决方案都显示出奇怪的行为:1.15898324042702949299155079643242061138153076171875。numpy.nextafter递减,而不是递增

让说我有下面的代码:

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 

回答

9

从文档(重点矿山):

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