簡體   English   中英

將long int轉換為float時,Numpy會丟失精度

[英]Numpy losing precision when converting long int to float

轉換為float類型時,似乎numpy正在失去numpy.int64值的精度。

我的numpy版本是1.15.4,它似乎解決了這個錯誤

這是一個例子:

>>> value = 734625324872288246
>>> value_plus_1 = 734625324872288246 + 1
>>> items = [value, value_plus_1]
>>> value.bit_length()
60
>>> value_plus_1.bit_length()
60
>>> import numpy as np
>>> a = np.array(items, dtype = np.float128) # larger than needed for value
>>> a
array([7.34625325e+17, 7.34625325e+17], dtype=float128)
>>> a.astype(np.int64) # larger than needed for value
array([734625324872288256, 734625324872288256])
>>> np.__version__
'1.15.4'

正如您所看到的,現在數組中的兩個值都是等價的,這表明我假設在轉換為浮動時會發生精度損失。

我的問題是; 在創建可以糾正不丟失精度的numpy數組時,我有什么問題嗎?

numpy文檔( https://docs.scipy.org/doc/numpy-1.15.0/user/basics.types.html )聲明float64的實現僅使用52位作為尾數,11位用於指數。 這很可能不足以准確地存儲您的60位數字。

(這個問題幾乎肯定是重復的,但今天我的搜索功能很弱。)

只有有限數量的數字可以用64位浮點數表示。 准確表示的數字之間的間距取決於數字的大小; 你可以找到函數numpy.spacing(x)的間距,表示浮點數x 在您的情況下,734625324872288246周圍的浮點數的間距是128:

In [33]: x = float(734625324872288246)

In [34]: x
Out[34]: 7.346253248722883e+17

In [35]: np.spacing(x)
Out[35]: 128.0

整數值734625324872288246不能完全表示為浮點。 你可以看到通過將float轉換回整數; 你沒有得到相同的價值:

In [36]: int(x)
Out[36]: 734625324872288256

您可以將734625324872288256完全表示為浮點數,但下一個較低的可表示整數是734625324872288256 - 128 = 734625324872288128。

以下是有關浮點問題的強制性鏈接:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM