2017-09-09 30 views
5

Tôi đã tạo một mã đơn giản trên trình thông dịch python và chạy nó.tại sao kết quả lại khác nhau giữa việc chạy trình thông dịch python và mã python?

Python 3.5.3 (v3.5.3:1880cb95a742, Jan 16 2017, 16:02:32) [MSC v.1900 64 bit (AMD64)] on win32 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import numpy as np 
>>> x=np.array([0,1]) 
>>> w=np.array([0.5,0.5]) 
>>> b=-0.7 
>>> np.sum(w*x)+b 
-0.19999999999999996 

kết quả -0.19999999999999996 là lạ. Tôi nghĩ .... nó được gây ra bởi quy tắc IEEE 754. Nhưng khi tôi cố gắng chạy gần như cùng một mã theo tệp, kết quả là rất khác nhau.

import numpy as np 
x = np.array([0,1]) 
w = np.array([0.5,0.5]) 
b = -0.7 
print(np.sum(w * x) + b) 

kết quả là "-0,2". Quy tắc IEEE 754 không ảnh hưởng đến kết quả.

sự khác biệt giữa chạy dựa trên tệp và thông dịch dựa trên hoạt động là gì?

+1

Bạn đã thử 'in (np.sum (w * x) + b) 'từ thông dịch viên của bạn? in không giống như yêu cầu thông dịch viên đại diện cho nó –

Trả lời

9

Sự khác biệt là do cách trình thông dịch hiển thị đầu ra.

Chức năng print sẽ cố gắng sử dụng phương pháp __str__ của đối tượng, nhưng trình thông dịch sẽ sử dụng đối tượng __repr__ của đối tượng.

Nếu trong thông dịch viên bạn đã viết:

... 
z = np.sum(w*x)+b 
print(z) 

(đó là những gì bạn đang làm trong mã của bạn), bạn sẽ thấy -0.2.

Tương tự, nếu trong mã của bạn, bạn đã viết:

print(repr(np.sum(w * x) + b)) 

(đó là những gì bạn đang làm trong thông dịch viên), bạn sẽ thấy -0.19999999999999996

+1

Tôi không biết điều này trước đây. Lời giải thích tuyệt vời! – chrisckwong821

+0

bạn có thể giải thích cách quy tắc IEEE754 không hoạt động trong in ấn() không? –

+0

@LaserCho - Tôi không chắc chắn ý của bạn là gì - quyết định thực hiện 'numpy64.float'' __repr__' và '__str__' khác nhau là của numpy, thực sự (Python đã từng làm điều này cho' float 'nhưng kể từ khi thống nhất chúng). – jedwards

0

Tôi nghĩ sự khác biệt nằm trong thực tế là bạn sử dụng print() cho mã dựa trên tệp của bạn, số này chuyển đổi số, trong trường hợp của trình thông dịch, bạn không sử dụng print(), mà là yêu cầu trình thông dịch hiển thị kết quả.

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