日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

浮點數乘法和整形乘除法的效率經驗比較_C 語言

作者:concyclics ? 更新時間: 2022-07-14 編程語言

前言

最近在做一個比賽,包含了如下內容:

環上邊的轉賬金額需要為前一條邊的轉賬金額的90%-110%(含邊界)。

對于“金額”的處理,我一開始以浮點數乘法(乘1.1和0.9)外加eps修正精度的方式進行判斷,有一位朋友看完我的代碼后提出意見:

C*S: 如果確定只有兩位小數且不炸范圍,那么有辦法完全消除浮點數的使用。

然后我照著整形的方式改,結果發現更慢了……

于是有了如下實驗:

測試

1. 整形除法和浮點數乘法

我們每次把整形加減自身/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;
}

結果:

long long花了1541ms,是double的幾乎十倍。

除法相較于加減乘有較大的常數。

2. 把整形預先乘10來比較

現在再試試另一種方法,即把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;
}

結果:


我們可以看到,雖然單次浮點乘法的常數會略大于整形乘法,但是三次整形乘法還是慢于兩次浮點乘法的。

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;
}

結果:

我們可以看到,單次浮點乘法的常數大概會比整形大50%左右,所以三次整形乘法還是略慢于兩次浮點乘法的。

總結

原文鏈接:https://blog.csdn.net/qq_21008741/article/details/120708655

欄目分類
最近更新