2012-11-09 9 views
7

Upadłem na dziwną sprawę. Próbowałem jednego z trzech rozwiązań opublikowanych tutaj z Pyson: Increment a python floating point value by the smallest possible amount. Wszystkie trzy rozwiązania wykazują dziwne zachowanie, gdy ląduję na tym zmiennoprzecinkowym: 1.15898324042702949299155079643242061138153076171875.numpy.nexta po zmniejszeniu zamiast inkrementacji

powiedzmy mam następujący kod:

import numpy as np 
from __future__ import division 

a = 1.15898324042702949299155079643242061138153076171875 
b = 0 
b = np.nextafter(a,1) 
print a, b 

z jakiegoś powodu, zamiast zwiększający b o najmniejszej możliwej ilości, to jest zmniejszany. Dlaczego tak jest?

Oto kilka szybkich wyników, które dostałam od zabawy:

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 

Odpowiedz

9

Od docs (kopalnia nacisk):

nextafter(x1, x2[, out]) 

Return the next representable floating-point value after x1 **in the direction 
of x2 element-wise**. 

Drugi argument nie jest kierunek podane przez +/- 1, jest to wartość do celu.

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 
Powiązane problemy