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輸出:( int,float ) : 2107 ms#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();
}
( 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輸出:( int,float ) : 149 ms( float,end ) : 173 ms輸出影象(分別為原圖,dst0,dst1)(擷取了一部分)main()
}timemark(
"float");
of3=0
;
for (int j = 0; j != h; ++j)
}timemark(
"end");
timeprint;
myshow(dst0);
myshow(dst1);
waitkey(0);
}
可見,時間並差不了多少,但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...