2014-05-20 22 views
5

Khi tôi chuyển đổi một số float64 một số float32 tôi nhận được một kết quả kỳ lạ:float64 để float32 chuyển đổi cho kết quả bất ngờ

In [22]: np.float32(20140131.0) 
Out[22]: 20140132.0 

Tại sao điều này xảy ra?

+0

http://stackoverflow.com/questions/16963956/difference-between-python-float-and-numpy-float32 – Pavel

+3

http://www.binaryconvert.com/result_float.html?decimal=050048049052048049051049046048 – Pavel

Trả lời

7

20140131.0 không thể được biểu diễn dưới dạng số nguyên 32 bit.

32 bit float

64 bit float

Với phao, trong mỗi phạm vi, các con số được đều nhau.

Vì vậy, nó là (1 + M) * 2^(E)

nên 20.140.131,0 là trong khoảng 2^24-2^25. Có 16.777.216 con số trong phạm vi đó, nhưng chỉ có 8,388,608 phao nổi. Vì vậy, bạn chỉ có thể thể hiện số chẵn.

Vì trong 32 bit nổi, chỉ có 23 bit cho phần định trị, số nguyên chỉ có thể được biểu diễn tối đa 2^24. Trên đó, epsilon > 1. Trường hợp epsilon là sự khác biệt giữa hai số dấu phẩy động liền kề.

Đối với nổi trăn, tôi tin rằng họ làm việc như thế này:

Floats trong python thường không 32 bit hoặc 64 bit, vì vậy đây không phải là một vấn đề. Độ dài được điều chỉnh tự động. Mua bạn đang truyền chúng sang các loại cụ thể, vì vậy bạn thấy sự thiếu độ phân giải. Với số nguyên 64 bit, có 52 bit trong phần định trị, vì vậy bạn sẽ không thấy vấn đề này cho đến khi bạn đi trên 2^53.

Ngoài ra, cách số được làm tròn đến phao gần nhất thường được xác định theo cách hệ thống (tôi nghĩ), nhưng việc tạo khuôn của python có thể vượt quá quy tắc này, tôi không hoàn toàn quen thuộc với nó.

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