一个更快的复活节日期算法
来源:benjoffe.com — 2026-11-10
📋 概述
作者把公历复活节的 computus 重写成一个只用 5 次乘法的定点版本,比常见日期库里的实现快约一倍,有效范围覆盖 -1100 万年到 +1600 万年——之所以定这个范围,是为了覆盖所有用有符号或无符号 32 位「rata die」表示日期的库。加速靠五个技巧:把输入整体平移以便常量折叠、从不真的计算 year mod 19、用无取反的方式算 X−(Y%7)、用 mod-pad 技巧加速 mod 30、以及把月与日打包进一个数一次算出来。
🔑 核心要点
- 全函数只有 5 次乘法,常见参考实现要 10 次以上,编译出的汇编也小得多
- 首个常量 400·19·(25·30·2−39) 同时把年份移到正区间,并抵消后续计算里的常量项
- 用 mul-shift(先乘常数再取高 32 位)一次拿到商与余数,省掉真正的取模
- 有效区间 −11,103,600 到 16,663,835 年,正好覆盖 32 位 rata die 的全部取值,越界也不会返回垃圾
- 项数虽多但二进制更小,在意体积的场合也是合理选择
💡 金句
这个范围看着像过度设计,但我之所以瞄着它,是为了让所有用 32 位 rata die 表示日期的库都被覆盖。
👍 0
👎 0
← 返回 Lobsters 首页