将整数除法转换为浮点除法是微不足道的
摘要
一篇技术博客文章,解释了如何使用浮点除法和融合乘加来执行整数除法和取余,并给出了操作数位宽的限制,同时讨论了SIMD和舍入模式的实际注意事项。
<p><a href="https://lobste.rs/s/nvmbfe/moving_integer_division_floating_point">评论</a></p>
查看缓存全文
缓存时间: 2026/08/10 23:03
# 将整数除法迁移到浮点数十分简单
来源:http://marc-b-reynolds.github.io/math/2026/08/10/IntDivByFP.html
整数除法 `q=\(x/y\)` 和(欧几里得除法的)余数 `r=\(x%y\)` 在当前硬件上的实现很不理想:通常延迟很长,吞吐量也很差。相比之下,浮点除法则比较友好:延迟更短、吞吐量更高,而且通常有更多执行单元可以执行该操作。所以在某些情况下,把一些整数 div/mod 运算迁移到浮点数可能会很有意思。但这很麻烦,对吧?实际上我认为这很简单。数学相当直接,如果我犯了错,估计很快就会被发现。
我的主张是:对于两个整数 `x` 与 `y`(有符号或无符号),它们分别能放入双精度/单精度的 53/24 位中,且都被提升为浮点数后,那么:
```
// 浮点:
// d 与整数除法 x / y 的结果相同
// m 与整数取余 x % y 的结果相同
// (标准舍入模式:四舍五入到最近值,ties to even)
d =
相似文章
当浮点数除法胜过整数除法
一篇博客文章,解释了一个反直觉的优化现象:在现代CPU上,使用浮点数除法(DIVSD)比整数除法(IDIVQ)性能更佳,并附有基准测试和汇编分析。
中间浮点精度
本文探讨了C++代码中的中间浮点精度如何依赖于编译器设置、CPU标志和架构,尤其是在x87 FPU上,以及这如何影响性能和计算结果。
RISC-V 与浮点运算
关于 RISC-V 架构浮点功能及更新的报告。
借助 Rust 新 API 实现更快的浮点运算
Rust 1.98 引入了一个新 API,通过允许更激进的编译器优化来加速浮点运算,同时仍让开发者控制舍入误差。
Unity 与浮点数运算
本文探讨了 Unity 中 Mathf 与 System.MathF 在 C# 中的性能和精度差异,揭示了 Unity 的 Mono 运行时即使对于 float 运算也常常会执行双精度数学运算,这对性能优化具有重要启示。