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?
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?
20140131.0 không thể được biểu diễn dưới dạng số nguyên 32 bit.
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ó.
http://stackoverflow.com/questions/16963956/difference-between-python-float-and-numpy-float32 – Pavel
http://www.binaryconvert.com/result_float.html?decimal=050048049052048049051049046048 – Pavel