Lobsters | 📄 原文链接 | 2026-10-28 收录

有符号 64 位地板除法的新快法:换个乘数就快一到两成

来源:benjoffe.com — 2026-10-27

📋 概述

地板除法(结果向 −∞ 取整)在时间戳、角度、网格坐标这类周期性场景里才是有用的那个,但主流编译器与 C/C++/Go/Swift 都不原生提供,已有实现又极少用最快的算法,作者甚至发现某个知名库带溢出的错误实现活了四年多。文章从编译器的截断除法讲起——本质是预计算魔数乘数、乘完后取高位、再给负数补 1——然后给出新技巧:让乘数本身随符号选择,M = 2^79/86400 + 1,m = M + (x>>63),结果取 (x·m)>>79。按作者在 ARM 与 x86 上的实测,理想编译下新算法在 ARM 上对多数 64 位除数比现有算法吞吐快 10–20%,在 x86 上约 80% 的正除数和 60% 的负除数快 5–10%;代价是剩余 x86 情形更慢、延迟通常更差。页面还提供任意位宽、任意除数的函数生成器与一份含边界测试的自包含 C++ 文件。

🔑 核心要点

💡 金句

这个技巧简单到我会以为早有人做过,但我四处找过,没有在任何地方看到它被记录过。
← 返回 Lobsters 首页