惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

WordPress大学
WordPress大学
Security Latest
Security Latest
C
Cisco Blogs
P
Palo Alto Networks Blog
Know Your Adversary
Know Your Adversary
Project Zero
Project Zero
C
Cyber Attacks, Cyber Crime and Cyber Security
NISL@THU
NISL@THU
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
S
Secure Thoughts
P
Privacy International News Feed
V
Vulnerabilities – Threatpost
D
Docker
Google Online Security Blog
Google Online Security Blog
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Recent Announcements
Recent Announcements
T
The Exploit Database - CXSecurity.com
G
Google Developers Blog
Schneier on Security
Schneier on Security
小众软件
小众软件
爱范儿
爱范儿
GbyAI
GbyAI
J
Java Code Geeks
T
Tailwind CSS Blog
Cisco Talos Blog
Cisco Talos Blog
The Hacker News
The Hacker News
D
DataBreaches.Net
Blog — PlanetScale
Blog — PlanetScale
TaoSecurity Blog
TaoSecurity Blog
MyScale Blog
MyScale Blog
B
Blog RSS Feed
Cyberwarzone
Cyberwarzone
有赞技术团队
有赞技术团队
Martin Fowler
Martin Fowler
C
CXSECURITY Database RSS Feed - CXSecurity.com
S
Securelist
L
Lohrmann on Cybersecurity
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Y
Y Combinator Blog
S
Schneier on Security
Latest news
Latest news
Apple Machine Learning Research
Apple Machine Learning Research
博客园 - 叶小钗
F
Fortinet All Blogs
M
MIT News - Artificial intelligence
PCI Perspectives
PCI Perspectives
V
V2EX
V2EX - 技术
V2EX - 技术
O
OpenAI News
W
WeLiveSecurity

文章 - 硬盘在歌唱 on 硬盘在歌唱

Open Prompt:AI 时代的 PR 协作新范式 AI 辅助编程时代,哪些编程语言会更流行? 从认知心理学看代码可读性 父子对谈30则 都2024了,你还没随身带录音笔吗? 写段子的窍门 给TiDB(MySQL)写一个代理网关 论怎么与基层干部打成一片 怎么做一个匿名论坛 适合程序员的桌面窗口管理方案 Go语言泛型初体验 双中心主从模式 TrueTime和原子钟 价值6万元的TiDB Hackathon创意 价值10万元的TiDB Hackathon创意 TiDB1024谜题解题报告 Paxos从入门到学会Raft 一个小故事,关于科幻,关于老师 beancount 复式记账实践
记一例浮点数精度问题
2026-02-10 · via 文章 - 硬盘在歌唱 on 硬盘在歌唱

说,内存中有两个不断递增的浮点数,我们记作 a 和 b。

程序不断运行的过程中,有两种操作会递增这两个数:

  1. 给 a 加上一个非负浮点数
  2. 给 a 和 b 同时加上一个非负整数

同时,后台有一个线程在不断向服务器以差值的形式上报 a 和 b 的增量。流程是:

deltaA = a - lastA
deltaB = b - lastB
report(deltaA, deltaB)
lastA = a
lastB = b

那么问题来了,服务端收到的 deltaA 和 deltaB 有没有可能出现 deltaA < deltaB 的情况呢?这里我们只考虑浮点数的精度问题,不考虑其他因素,比如线程调度等等。

显然既然写这个,答案肯定是有可能。

不过这看起来很奇怪,因为 a 和 b 的增量都是非负的,而且 a 每次的增量只会比 b 大不可能比 b 小。但是,浮点数的精度问题可能会导致这种情况发生。

问题就出在每次上报的差值运算。lastA 和 a 都是不断累加出来的,可能都有精度误差,并且误差舍入的方向可能不同,如果lastA 的误差方向是向上的,而 a 的误差方向是向下的,那么 deltaA 就可能比 deltaB 小。

直观的例子:

lastA = 2000000.300000000005
lastB = 1000000.0

执行操作 2,a 和 b 同时加上 120.0 后

a = 2000120.300000000004
b = 1000120.0

此时计算 delta 理应都是 120,但由于精度丢失 deltaA 会偏小。

deltaA = a - lastA = 119.999999999999
deltaB = b - lastB = 120.0