簡體   English   中英

使用64位浮點數而不是32位浮點數的原因

[英]Reasons for using 64bit floats instead of 32 bit floats

我正在對大約1000萬個長度的ndarrays進行一些分析。

源數據號的范圍是1.00至1000.00,帶兩位小數。

我發現使用32位浮點數以及50%的浮點數在執行浮點算術時速度要快30%。

我正在考慮將所有數據轉換為32位。 如果這樣做,將來是否會遇到任何問題?

編輯:

對代碼進行更多測試,如果我使用numba遍歷此數據,則32位的性能會稍慢一些。

但是,如果我使用numpy並進行矢量化操作,則32位要快得多。

有什么可以解釋的?

from numba import autojit

@autojit( nopython=True )
def nsum( x ):
    r=0.0
    for i in range( x.shape[0] ):
        r+=x[i]
    return r

y64 = np.random.randn( 1e7 )
y32 = y64.astype( np.float32 )

%timeit nsum( y64 )
%timeit nsum( y32 )

> 100 loops, best of 3: 18.3 ms per loop
> 100 loops, best of 3: 18.6 ms per loop

%timeit y64**2
%timeit y32**2

> 10 loops, best of 3: 54.4 ms per loop
> 10 loops, best of 3: 27.3 ms per loop

由於您使用的是有限的浮點數子集,因此也許應該考慮使用100到100000之間的整數來容納兩個小數位。

ints也是32位,但在使簡單操作快得多且不降低精度方面具有一些優勢。

這將取決於您對這些數字的處理方式。

32位浮點數將降低精度,這對於您的應用程序可能會或可能不會出現問題。

由於小數位數固定,因此最好改用定點數學。 您可以將所有內容存儲為整數,並按比例放大100倍。這意味着12.34將存儲為1234。您的數學運算將是精確的(無浮點錯誤),並且由於它是所有整數,因此其運行速度應比整數快。浮點數學。 但是,它的確使事情復雜了一些-您需要知道乘法和除法時小數點的移動方式。

如果您需要更高的精度,則需要使用64位浮點數。

計算機通過將數字表示為位和字節來工作。 對於浮點數,字節的某些部分用於整數,而某些部分用於小數。 根據需要表示的內容,移動小數位(因此稱為“浮點數”),因此允許使用較高的整數(具有較小的十進制精度)或較低的整數(具有較高的十進制精度)。

如果您的范圍是1到1000,並且只有兩位小數,那么即使32位浮點型也可能太大了,但假設這是您的輸入函數需要的值,那么可以-使用32位浮點型,除非您需要非常大的數字或十進制精度。

資料來源:我試圖簡化一個復雜的comp-sci主題。 可以在此處找到更多信息,網址為: http : //en.wikipedia.org/wiki/Floating_point

暫無
暫無

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

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