2014-04-09 19 views
51
In [25]: np.power(10,-100) 
Out[25]: 0 

In [26]: math.pow(10,-100) 
Out[26]: 1e-100 

Tôi mong đợi cả hai lệnh trả về 1e-100. Đây không phải là một vấn đề chính xác, vì vấn đề vẫn còn ngay cả sau khi tăng độ chính xác lên 500. Có một số cài đặt mà tôi có thể thay đổi để có được câu trả lời đúng không?Tại sao numpy.power trả về 0 cho số mũ nhỏ trong khi math.pow trả về câu trả lời đúng?

Trả lời

70

Ồ, đó là nhiều "tồi tệ" hơn thế:

In [2]: numpy.power(10,-1) 
Out[2]: 0 

Nhưng đây là một gợi ý để những gì đang xảy ra: 10 là một số nguyên, và numpy.power không ép buộc các con số để nổi. Nhưng điều này hoạt động:

In [3]: numpy.power(10.,-1) 
Out[3]: 0.10000000000000001 

In [4]: numpy.power(10.,-100) 
Out[4]: 1e-100 

Lưu ý, tuy nhiên, các nhà điều hành điện, **, không chuyển đổi thả nổi: (. Chỉ cần một chú thích cho hai câu trả lời khác trên trang này)

In [5]: 10**-1 
Out[5]: 0.1 
+0

Đây là điều chắc chắn nên đưa ra cảnh báo tự động với mô-đun uể oải – mjp

35

phương pháp gọn gàng giả định bạn muốn số nguyên được trả về vì bạn đã cung cấp số nguyên.

np.power(10.0,-100) 

hoạt động như bạn mong đợi.

2

Được nhập hai giá trị đầu vào, bạn có thể kiểm tra kiểu dữ liệu của đối tượng np.power sẽ trở lại bằng cách kiểm tra thuộc tính types:

>>> np.power.types 
['bb->b', 'BB->B', 'hh->h', 'HH->H', 'ii->i', 'II->I', 'll->l', 'LL->L', 'qq->q', 
'QQ->Q', 'ee->e', 'ff->f', 'dd->d', 'gg->g', 'FF->F', 'DD->D', 'GG->G', 'OO->O'] 

Các loại số nguyên tương thích với Python được ký hiệu là l, phao Python tương thích tương thích theo d (documents).

np.power có hiệu quả quyết định những gì cần trả lại bằng cách kiểm tra loại đối số được chuyển và sử dụng chữ ký phù hợp đầu tiên từ danh sách này.

Vì vậy, cho 10 và -100, np.power khớp với số integer integer -> integer chữ ký và trả về số nguyên 0.

Mặt khác, nếu một trong các đối số là phao thì the integer argument will also be cast to a float và chữ ký float float -> float được sử dụng (và giá trị nổi chính xác được trả lại).

Các vấn đề liên quan