浮點數的運算為什麼更慢

2022-03-24 03:08:00 字數 2443 閱讀 2289

1. 浮點數的表示

m 是尾數, 為±d.dddddd   其中 第一位必須非0

b 是基數, 

下面,讓我們回到一開始的問題:為什麼0x00000009還原成浮點數,就成了0.000000?

首先,將0x00000009拆分,得到第一位符號位s=0,後面8位的指數e=00000000,最後23位的有效數字m=000 0000 0000 0000 0000 1001。

v=(-1)^0×0.00000000000000000001001×2^(-126)=1.001×2^(-146)

通用規則:

特別案例:

示例**:

#include #include 

#include

#include

#include

#include

"libyuv.h

"using

namespace

cv;using

namespace

std;

using

namespace

oop;

intmain()

}timemark(

"float");

for (int j = 0; j != 100000; ++j)

}timemark(")

");timeprint;

printf(

"sum=%d\nsumf=%.2f\n

",sum,sumf);

getchar();

}

輸出:( int,float ) : 2107 ms

( float,) ) : 3951 ms

sum=7340000

sumf=7340000.00

release:

( int,float ) : 0 ms

( float,) ) : 1814 ms

sum=7340000

sumf=7340000.00

實際上: debug模式下, 兩者時間差不了多少,兩倍的關係

但是release模式下, int 幾乎很快就完成了!!  說明int型被優化得很好了,float型運算不容易被編譯器優化!!!

我們在release模式下, 優化設定為o2, 聯結器設定為-優化以便於除錯

檢視int 乘法彙編指令:xmm0 表示128位的sse暫存器,可見我們的**都被優化為sse指令了!!

檢視float 彙編**:

感覺裡面也有xmm 等sse指令集, 至於為啥int型乘法比float乘法快很多,  還是有點搞不明白, 需要詳細分析裡面的彙編指令才能搞明白

網上關於這方面的資料太少了, 哎~~

我們再看看float 和 int乘法對影象進行處理的例子:

我們把bgr 3個通道分別乘以2 3 4 、 2.0f, 3.0f, 4.0f 然後輸出, 這裡我們不考慮溢位的問題, 僅僅對乘法的效率進行測試

設定為release模式,o2

int

main()

}timemark(

"float");

of3=0

;

for (int j = 0; j != h; ++j)

}timemark(

"end");

timeprint;

myshow(dst0);

myshow(dst1);

waitkey(0);

}

輸出:( int,float ) : 149 ms( float,end ) : 173 ms輸出影象(分別為原圖,dst0,dst1)(擷取了一部分)

可見,時間並差不了多少,但int還是要快一點!!

這是我看到的另外乙個帖子,裡面講的float乘法確實比較複雜 , 這可能是它比較慢的原因之一吧

總結一下: float運算更慢的原因:

1. float運算不容易被編譯器優化

2. float運算本身就慢(但並不比int型運算慢多少,大約1.3-2倍的樣子)

浮點數運算

浮點數運算的公式 n m re n代表浮點數 m代表尾數 r代表基數 e代表指數 所謂浮點數就是類似我們高中學的科學計數法 比如 1000 就表示為 1.0 103 那麼浮點型計算就是兩個用科學計數法表示的數之間進行的計算 例如 1.0 102 1.19 103 該如何計算 步驟 1.對階 所謂對階...

浮點數運算

今天學習了浮點數運算 加減乘除 浮點數運算主要包括兩部分 指數運算和尾數運算。在ieee754標準下,指數運算就是階碼的運算,類似於無符號數運算。尾數運算是原碼運算。之前一直很疑惑為什麼前面的教材在介紹原碼運算 加減乘除 所舉的例子都是小數運算。現在猜想那部分內容可能只是為了浮點數運算做鋪墊,這裡才...

浮點數的運算

規格化的浮點數因為儲存是使用類似科學計數法的表示,因此計算方法大體上與科學計數法較為類似。浮點加減法的一般步驟 減法本質也是加法 對於二進位制形式的兩個浮點數相加 1.對階 對於兩個規格化浮點數,將較小的指數的數向較大指數的數對齊。通過移動小數點實現。如果出現有效數字位數不能滿足的情況,進行近似。2...