網站首頁 編程語言 正文
前言
最近在做一個比賽,包含了如下內容:
環上邊的轉賬金額需要為前一條邊的轉賬金額的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
相關推薦
- 2022-02-25 C++構造函數的初始化列表詳解_C 語言
- 2022-01-09 WHATWG API——url.parse()的替代方案
- 2022-06-17 Redis實現驗證碼發送并限制每日發送次數的示例代碼_Redis
- 2023-07-08 如何讓element-ui的el-row內容居中(水平垂直)
- 2022-09-18 C#面向對象編程中依賴反轉原則的示例詳解_C#教程
- 2022-12-12 React?高階組件與Render?Props優缺點詳解_React
- 2023-10-30 配置阿里的yum源
- 2022-04-05 本地文件提交到gitee上報錯的問題:error: src refspec master does
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支