浮點(diǎn)數(shù)乘法和整形乘除法的效率經(jīng)驗(yàn)比較
前言
最近在做一個(gè)比賽,包含了如下內(nèi)容:
環(huán)上邊的轉(zhuǎn)賬金額需要為前一條邊的轉(zhuǎn)賬金額的90%-110%(含邊界)。
對(duì)于“金額”的處理,我一開(kāi)始以浮點(diǎn)數(shù)乘法(乘1.1和0.9)外加eps修正精度的方式進(jìn)行判斷,有一位朋友看完我的代碼后提出意見(jiàn):
C*S: 如果確定只有兩位小數(shù)且不炸范圍,那么有辦法完全消除浮點(diǎn)數(shù)的使用。

然后我照著整形的方式改,結(jié)果發(fā)現(xiàn)更慢了……
于是有了如下實(shí)驗(yàn):
測(cè)試
1. 整形除法和浮點(diǎn)數(shù)乘法
我們每次把整形加減自身/10,來(lái)模擬上下浮動(dòng)10%,并把浮點(diǎn)形乘1.1(0.9)并修正eps精度誤差。
測(cè)試代碼如下:
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來(lái)比較
現(xiàn)在再試試另一種方法,即把0.9x<y<1.1x變成9x<10y<11x的形式,這樣不就全是整形乘法了嗎?但是三次整形乘法和兩次浮點(diǎn)乘法兩次浮點(diǎn)加減法哪個(gè)慢呢?
測(cè)試代碼如下:
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é)果:

我們可以看到,雖然單次浮點(diǎn)乘法的常數(shù)會(huì)略大于整形乘法,但是三次整形乘法還是慢于兩次浮點(diǎn)乘法的。
3. 單次浮點(diǎn)乘法和整形乘法比較
測(cè)試代碼:
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é)果:

我們可以看到,單次浮點(diǎn)乘法的常數(shù)大概會(huì)比整形大50%左右,所以三次整形乘法還是略慢于兩次浮點(diǎn)乘法的。
總結(jié)
這次實(shí)驗(yàn)給了我一個(gè)思路,即在對(duì)精度不敏感的情況下,可以把整形的/10之類(lèi)的除法,換成*0.1的浮點(diǎn)乘法來(lái)提速,更多關(guān)于浮點(diǎn)數(shù)乘法和整形乘除法效率的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
vscode ssh遠(yuǎn)程連接服務(wù)器一直卡在下載 vscode server問(wèn)題解決
在使用vscode使用ssh遠(yuǎn)程連接服務(wù)器時(shí),一直卡在下載"vscode 服務(wù)器"階段,本文主要介紹了vscode ssh遠(yuǎn)程連接服務(wù)器一直卡在下載 vscode server問(wèn)題解決,感興趣的可以了解一下2025-01-01
C語(yǔ)言實(shí)現(xiàn)動(dòng)態(tài)擴(kuò)容的string
最近工作中使用C語(yǔ)言,但又苦于沒(méi)有高效的字符串實(shí)現(xiàn),字符串的拼接和裁剪都很麻煩,而且每個(gè)字符串都需要申請(qǐng)內(nèi)存,內(nèi)存的申請(qǐng)和釋放也很容易出bug,怎么高效的實(shí)現(xiàn)一個(gè)不需要處理內(nèi)存問(wèn)題并且可以動(dòng)態(tài)擴(kuò)容進(jìn)行拼接和裁剪的string呢?本文就來(lái)詳細(xì)講講2023-04-04
C語(yǔ)言 常量,變量及數(shù)據(jù)詳細(xì)介紹
這篇文章主要介紹了C語(yǔ)言 常量,變量及數(shù)據(jù)詳解的相關(guān)資料,需要的朋友可以參考下2016-10-10

