2012-11-09 30 views
7

Tôi rơi vào một trường hợp kỳ lạ. Tôi đã thử một trong ba giải pháp được đăng ở đây từ Pyson: Increment a python floating point value by the smallest possible amount. Tất cả ba giải pháp hiển thị một hành vi lạ khi tôi hạ cánh trên điểm nổi này: 1.15898324042702949299155079643242061138153076171875.numpy.nextafter decrementing thay vì tăng

Hãy nói tôi có đoạn mã sau:

import numpy as np 
from __future__ import division 

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

Đối với một số lý do, thay vì incrementing b bởi số lượng nhỏ nhất có thể, nó được giảm đi. Tại sao vậy?

Dưới đây là một số kết quả nhanh chóng mà tôi nhận được từ chơi xung quanh:

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 

Trả lời

9

Từ các tài liệu (tôi nhấn mạnh):

nextafter(x1, x2[, out]) 

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

Đối số thứ hai không phải là một hướng nhất định bởi +/- 1, đó là giá trị để nhắm tới.

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