C++ WonderTrader 源碼分析之浮點數處理

介紹

在WonderTrader的文件decimal.h中封裝了一些用于浮點數(double)處理的工具函數,主要目的是解決浮點數精度誤差帶來的比較問題,以及進行一些常用運算(四舍五入、比較、取模等)。下面我們逐行詳細解釋每個函數的功能和實現邏輯。

🔹命名空間聲明

namespace decimal { ... }

這將所有函數和常量包裹在 decimal 命名空間中,避免和其他代碼沖突。

🔹EPSINON 常量定義

const double EPSINON = 1e-6;

用于浮點數比較的誤差容忍值,表示在 1e-6 精度內認為兩個浮點數相等。這是處理浮點誤差的標準做法。

? 1. rnd:浮點數四舍五入

inline double rnd(double v, int exp = 1) 
{return round(v * exp) / exp;
}
作用:

將浮點數 v 按 exp 精度進行四舍五入。

舉例:
輸入輸出
rnd(3.14159, 100)3.14
rnd(3.14159, 1000)3.142
rnd(123.456, 1)123

exp 決定精度:100 表示保留兩位小數,1000 表示三位。

? 2. eq:判斷是否相等(考慮精度誤差)

inline bool eq(double a, double b = 0.0) noexcept
{return(fabs(a - b) < EPSINON);
}
作用:

判斷 a 和 b 是否“近似相等”,誤差在 1e-6 以內。

說明:

使用 fabs(a - b) 代替 a == b 是因為浮點數存在精度問題,直接比較會出錯。

舉例:
eq(0.3333333, 1.0/3) // true,雖然嚴格上不相等

? 3. gt:大于判斷(排除誤差)

inline bool gt(double a, double b = 0.0) noexcept
{return a - b > EPSINON;
}
作用:

判斷 a > b,但要求 a - b 必須大于一個誤差量 EPSINON,否則認為兩者相等

? 4. lt:小于判斷(排除誤差)

inline bool lt(double a, double b = 0.0) noexcept
{return b - a > EPSINON;
}

等價于判斷 a < b,但考慮了浮點誤差。

? 5. ge:大于等于判斷

inline bool ge(double a, double b = 0.0) noexcept
{return gt(a, b) || eq(a, b);
}

即:如果 a > b 或 a ≈ b,則 a >= b。

? 6. le:小于等于判斷

inline bool le(double a, double b = 0.0) noexcept
{return lt(a, b) || eq(a, b);
}

即:如果 a < b 或 a ≈ b,則 a <= b。

? 7. mod:浮點數“取模”

inline double mod(double a, double b)
{return a / b - round(a / b);
}
功能:

返回 a / b 與最接近的整數的偏差部分(不是傳統意義上的“取余”,而是衡量 a 與 b 的整數倍的偏差)。

舉例:
mod(10.2, 5) = 10.2/5 - round(10.2/5) = 2.04 - 2 = 0.04
mod(14.9, 5) = 2.98 - 3 = -0.02
用途:

可用于判斷一個值是否接近某個周期的整數倍。例如:

if (fabs(mod(t, period)) < 1e-6) {// t 是 period 的整數倍(考慮浮點誤差)
}

或者用來檢查委托價格是否是價格最小變動單位(價差)PriceTick 的整數倍,即判斷這個價格是否“合法”。

// 檢查價格是否非零(為 0 就沒必要檢查 tick 合法性了)
if(!decimal::eq(entrust->getPrice(), 0)) 
{// 獲取該合約最小價格變動單位(例如 0.2、0.01、0.0001 等)double pricetick = commInfo->getPriceTick();// 看價格是 tick 的幾倍,可能是小數double v = entrust->getPrice() / pricetick;// 判斷價格是否是 pricetick 的整數倍(即合法價格)if (!decimal::eq(decimal::mod(entrust->getPrice(), pricetick), 0))	{bPass = false;msg = "委托價格不合法";break;}
}

總結:這些函數解決的問題

函數功能描述關鍵意義
rnd四舍五入到指定精度格式化數值
eq判斷兩個浮點數近似相等避免 a == b 失敗
gt/lt判斷嚴格大于/小于(排除誤差)精確控制浮點比較
ge/le判斷大于等于/小于等于浮點穩定性判斷
mod判斷是否接近某個倍數(周期性)用于時間或頻率周期判斷

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/92322.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/92322.shtml
英文地址,請注明出處:http://en.pswp.cn/web/92322.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

指針——練習

sizeof和strlensizeofsizeof是用來計算變量所占內存空間大小的&#xff0c;單位是字節&#xff0c;如果操作數是類型&#xff0c;計算的是使用類型創建的變量所占內存空間的大小。sizeof只關注占用內存空間的大小&#xff0c;不在乎內存中存放什么數據。我們來看一下這個代碼&a…

華為云 Flexus 部署 coze-studio

華為云 Flexus 部署 coze-studio 一、前置 主機和程序&#xff1a;云主機&#xff08;Flexus L ubuntu&#xff09; coze-studio 部署方式&#xff1a;docker&#xff08;提前裝好的&#xff09; 字節跳動開源AI智能體開發平臺Coze&#xff0c;具備極低的硬件門檻——2核CPU…

Linux系統編程Day7 -- 基于Linux系統知識的第一個程序

往期內容回顧 自動化構建工具-make/Makefile gcc/g編譯及鏈接 Vim工具的使用 Linux常用工具&#xff08;yum與vim&#xff09; ?????? Linux系統編程Day4-- Shell與權限 編寫第一個Linux程序 今天我們要利用我們所學到的Linux語言來編譯第一個Linux程序&#xff0c;在進行…

安卓264和265編碼器回調編碼數據寫入.265或者.264文件、查看編碼數據是否正確、轉換為Mp4文件、查看Mp4文件信息等方法合集

一、寫入文件 1、變量定義 private FileOutputStream m265FileOutputStream null; private File m265File null; private static final String HEVC_265_FILE_NAME "output.265"; // 或 .265 private static final String AVC_264_FILE_NAME "output.264&qu…

如何打造一支AI時代下的IT團隊,為企業戰略目標快速賦能

執行摘要 在當前AI技術迅猛發展的背景下&#xff0c;中國中小企業正面臨著前所未有的數字化轉型機遇與挑戰。據最新調研顯示&#xff0c;2025年全球AI市場規模將突破5000億美元&#xff0c;而中國AI應用占比已達35%。與此同時&#xff0c;AI領域人才缺口高達1000萬人&#xff0…

機器學習-LinearRegression

1、 關鍵數學知識點&#xff1a; 邊緣概率密度 聯合密度對非關注變量積分&#xff1a;fX(x)∫fX,Y(x,y)dyf_X(x)∫f_{X,Y}(x,y)dyfX?(x)∫fX,Y?(x,y)dy&#xff1b; 條件概率密度 切片 fX∣Y(x∣y)fX,Y(x,y)/fY(y)f_{X|Y}(x|y)f_{X,Y}(x,y)/f_Y(y)fX∣Y?(x∣y)fX,Y?(x,y)…

解決微信小程序中如何把npm構建的模塊與主包分離,構建到分包上面

1、配置分包2、復制packge.json到分包中3、在project.config.json中增加npm配置4、終端執行npm i下載模塊5、構建npm到miniprogram_npm中

自動駕駛中的傳感器技術21——Camera(12)

自動駕駛攝像頭的圖像評測 攝像頭的性能受到環境光照、天氣條件、運動模糊等因素的影響&#xff0c;因此需要通過多方面的評測來確保其在各種場景下的可靠性。 在自動駕駛領域&#xff0c;圖像質量評估不僅關注圖像的清晰度、分辨率等傳統指標&#xff0c;還需要結合目標檢測…

AI+OA原生應用 麥當秀AIPPT

麥當秀也在WAIC期間重新定義AIOA一、什么是“原生AI”&#xff1f;“原生AI”可以理解為&#xff1a;AI系統本身具備完整的辦公能力&#xff0c;不需要依賴傳統辦公軟件&#xff08;如Word、Excel、PPT&#xff09;作為載體。也就是說&#xff0c;用戶可以直接通過AI系統完成文…

K8S 入門操作

之前一直用kubectl這個命令操作&#xff0c;這些都是基于命令來操作K8S kubectl get pods kubectl get nodes kubectl get svc kubectl create deployment... kubectl expose deployment...kubectl 文檔 命令行工具 (kubectl) | Kubernetes 命令參考 Kubectl Reference Doc…

蒙文OCR識別技術難點實現及應用場景剖析

一、蒙文OCR識別核心技術難點1. 文字特性帶來的識別挑戰連寫特性&#xff1a;蒙文字符存在復雜的連寫形式&#xff08;詞首、詞中、詞尾變形&#xff09;方向特異性&#xff1a;傳統蒙文為垂直書寫&#xff08;現代也有橫排&#xff09;&#xff0c;需特殊方向處理字符相似性&a…

通過docker構建一個java鏡像

通過docker構建一個java鏡像 FROM zlyxzq/centos7:v1 VOLUME /tmp WORKDIR /app COPY /target/aa.jar /root/app/aa.jarENV TZAsia/Shanghai RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezoneENV JAVA_HOME /usr/local/java ENV PA…

SpringBoot學習日記 Day5:解鎖企業級開發核心技能

一、前言&#xff1a;從玩具項目到生產系統經過前四天的學習&#xff0c;我們已經能夠開發基礎功能了。但要讓應用真正具備生產價值&#xff0c;還需要掌握數據庫高級操作、事務控制、緩存優化等企業級開發技能。今天就來攻克這些關鍵知識點&#xff01;二、JPA進階&#xff1a…

將英文PDF文件完整地翻譯成中文的4類方式

文章目錄一、在線翻譯服務&#xff08;最快捷&#xff0c;適合臨時查看&#xff09;1.1 代表工具&#xff1a;1.2 操作流程&#xff08;以Google翻譯為例&#xff09;1.3 優點和缺點1.4 適用場景二、專業軟件&#xff08;最佳平衡&#xff0c;兼顧格式與質量&#xff09;2.1 代…

【分享】我國八大沙漠空間矢量范圍

今天小編整理分享的是 我國八大沙漠空間矢量范圍shp。▲ 我國八大沙漠空間矢量范圍概況數據概況我國八大沙漠空間矢量范圍。中國八大沙漠。分別為騰格里沙漠&#xff0c;塔克拉馬干沙漠&#xff0c;巴丹吉林沙漠&#xff0c;庫布奇沙漠&#xff0c;烏蘭布和沙漠&#xff0c;庫…

【音視頻】WebRTC C++ native 編譯

一、搭建環境 我們這里介紹在Windows10VS2019的環境下編譯WebRTC源碼&#xff0c;由于WebRTC源碼在外網上&#xff0c;需要科學的方式下載&#xff0c;不然下載特別慢&#xff0c;建議直接找國內下載好的源碼&#xff0c;這里的源碼是2021年的版本&#xff1a;https://pan.bai…

Selenium在Pyhton應用

目錄 1. selenium的基本原理 2. selenium環境的搭建步驟 3. 元素的定位和操作 4.元素的基本屬性方法 5.瀏覽器的操作方法 6.三種等待 強制等待 顯示等待 隱式等待 7. 鍵盤與鼠標的操作 鼠標懸停用 拖拽操作 8. 下拉框元素定位 9.頁面滾動操作 10. 頁面截圖操作 S…

【Docker】Redis基礎命令在Docker中的使用

文章目錄一 Redis 容器化部署指南1 獲取 Redis 鏡像2 服務啟動2.1 首次啟動新容器2.2 重啟已有容器3 服務驗證4 連接 Redis5 數據持久化方案5.1 使用 Docker 卷5.2 啟用 AOF 持久化6 容器管理6.1 停止容器6.2 刪除容器7 數據清理7.1 清空 Redis 數據7.2 完全移除7.3 刪除數據卷…

ubuntu 2024 安裝拼音輸入法

1. 卸載ibussudo apt remove ibus2. install fcitx5核心組件sudo apt install fcitx5 fcitx5-chinese-addons fcitx5-material-color3. 安裝中文語言支持sudo apt install language-pack-zh-hans4. 設置默認輸入法im-config -n fcitx55. 配置環境變量sudo vim ~/.bashrc粘貼&am…

語言模型的多個agent

是的&#xff0c;語言模型 在某些情況下確實可以通過多個 agent&#xff08;代理&#xff09;來共同協作完成任務。這種設計通常用于復雜任務或需要多步驟處理的場景&#xff0c;具體的流程如下&#xff1a; 1. 什么是 Agent&#xff1f; Agent&#xff08;代理&#xff09; 是…