浮點數(shù)乘法和整形乘除法的效率經(jīng)驗比較
前言
最近在做一個比賽,包含了如下內(nèi)容:
環(huán)上邊的轉(zhuǎn)賬金額需要為前一條邊的轉(zhuǎn)賬金額的90%-110%(含邊界)。
對于“金額”的處理,我一開始以浮點數(shù)乘法(乘1.1和0.9)外加eps修正精度的方式進行判斷,有一位朋友看完我的代碼后提出意見:
C*S: 如果確定只有兩位小數(shù)且不炸范圍,那么有辦法完全消除浮點數(shù)的使用。
然后我照著整形的方式改,結(jié)果發(fā)現(xiàn)更慢了……
于是有了如下實驗:
測試
1. 整形除法和浮點數(shù)乘法
我們每次把整形加減自身/10,來模擬上下浮動10%,并把浮點形乘1.1(0.9)并修正eps精度誤差。
測試代碼如下:
int main() { const int N=1e8; int64_t t1=clk(); for(int i=0;i<N;i++) { long long x=i; x=x+x/10; x=x-x/10; } int64_t t2=clk(); for(int i=0;i<N;i++) { double x=i; x=x*1.1+1e-5; x=x*0.9-1e-5; } int64_t t3=clk(); cout<<"long long "<<t2-t1<<endl; cout<<"double "<<t3-t2<<endl; }
結(jié)果:
long long花了1541ms,是double的幾乎十倍。
除法相較于加減乘有較大的常數(shù)。
2. 把整形預(yù)先乘10來比較
現(xiàn)在再試試另一種方法,即把0.9x<y<1.1x變成9x<10y<11x的形式,這樣不就全是整形乘法了嗎?但是三次整形乘法和兩次浮點乘法兩次浮點加減法哪個慢呢?
測試代碼如下:
int main() { const int N=1e8; int64_t t1=clk(); for(int i=0;i<N;i++) { long long x=i; x=x*11; x=x*9; x=x*10; } int64_t t2=clk(); for(int i=0;i<N;i++) { double x=i; x=x*1.1+1e-5; x=x*0.9-1e-5; } int64_t t3=clk(); cout<<"long long "<<t2-t1<<endl; cout<<"double "<<t3-t2<<endl; }
結(jié)果:
我們可以看到,雖然單次浮點乘法的常數(shù)會略大于整形乘法,但是三次整形乘法還是慢于兩次浮點乘法的。
3. 單次浮點乘法和整形乘法比較
測試代碼:
int main() { const int N=1e8; int64_t t1=clk(); for(int i=0;i<N;i++) { long long x=i; x=x*11ll; } int64_t t2=clk(); for(int i=0;i<N;i++) { double x=i; x=x*1.1; } int64_t t3=clk(); cout<<"long long "<<t2-t1<<endl; cout<<"double "<<t3-t2<<endl; }
結(jié)果:
我們可以看到,單次浮點乘法的常數(shù)大概會比整形大50%左右,所以三次整形乘法還是略慢于兩次浮點乘法的。
總結(jié)
這次實驗給了我一個思路,即在對精度不敏感的情況下,可以把整形的/10之類的除法,換成*0.1的浮點乘法來提速,更多關(guān)于浮點數(shù)乘法和整形乘除法效率的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
c++實現(xiàn)LinkBlockedQueue的問題
這篇文章主要介紹了c++實現(xiàn)LinkBlockedQueue的問題,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-10-10你真的理解C語言qsort函數(shù)嗎?帶你深度剖析qsort函數(shù)
這篇文章主要介紹了你真的理解C語言qsort函數(shù)嗎?帶你深度剖析qsort函數(shù),本篇將引入一個庫函數(shù)來實現(xiàn)我們希望的順序,結(jié)合示例代碼給大家介紹的非常詳細,需要的朋友可以參考下2023-02-02C++實現(xiàn)LeetCode(162.求數(shù)組的局部峰值)
這篇文章主要介紹了C++實現(xiàn)LeetCode(162.求數(shù)組的局部峰值),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-07-07C++實現(xiàn)LeetCode(205.同構(gòu)字符串)
這篇文章主要介紹了C++實現(xiàn)LeetCode(205.同構(gòu)字符串),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-07-07