整数除法转浮点运算竟如此简单

Moving integer division to floating-point is trivial

当前硬件上的整数除法和取余运算延迟高、吞吐低,而浮点除法却快得多。我提出一个简单方法:将符合精度要求的整数转为浮点数,利用标准舍入模式下的浮点除法,再配合 fma 指令,即可精确还原整数商和余数。关键在于浮点除法在二进制下不存在“中间值”舍入问题,因此无需担心精度丢失。虽然涉及类型转换和舍入模式切换的开销,但在 SIMD 场景或特定硬件(如 AVX-512)下,这种技巧能显著提升性能。

对于能容纳在双精度或单精度浮点数范围内的整数,将其转为浮点后执行除法,再结合 fma 指令,就能精确得到整数商和余数。
  1. taeric

    我很好奇,这些操作的延迟实际上比浮点运算还要差。是的,它们确实比许多整数指令差,但它们似乎与等效的浮点运算处于同一数量级?

  2. juancn

    我很想看到一些在合理实际场景下的基准测试。

    在许多常见情况下,位移和掩码操作可以替代整数除法(例如哈希表),从而完全避免除法,而这大概也就相当于将 int 转换为 float 的成本。

  3. RossBencina

    x 和 y 是以浮点数形式表示的整数

    > d = trunc(x/y); // floor 适用于无符号数

    >

    > // 注意:如果只需要 'd' 且它将被转换为整数,那么截断或取整操作在从 float 到整数的转换中是“免费”的。

    请展示一下如何在 C 语言中可移植地“免费”将浮点值截断或向下取整为 int。

同日更多故事

2026-08-14