整数除算を浮動小数点に移行するのは簡単だ

Moving integer division to floating-point is trivial

整数除算と剰余演算はハードウェア上で遅く、レイテンシが長くスループットも低い。一方、浮動小数点除算は高速で、実行ユニットも多い。そこで、整数除算を浮動小数点演算に置き換える手法が提案されている。符号付き・符号なしの整数が倍精度なら53ビット、単精度なら24ビットに収まる場合、`trunc(x/y)`と`fma`を使えば整数除算と剰余を正確に計算できる。これは標準の丸めモード(最近接偶数丸め)で機能し、タイブレークが発生しないことが数学的に保証されている。SIMDでの利用や、除数の再利用が少ない場合に有効で、定数除数ではコンパイラが最適化する。

私の主張は、53/24ビットに収まる整数xとy(符号付きまたは符号なし)を浮動小数点に変換すれば、標準の丸めモードでd = trunc(x/y) と m = -fma(d,y,-x) が整数除算と剰余に一致するということです。
  1. sjrd

    Vincent Lefèvreによる論文があり、それが確かに浮動小数点除算とfloorがユークリッド除算を実装することを証明しており、その成立条件を注意深く分析しています。[1] この論文の主定理の系として、最近接丸めの場合、xとyが符号なし53ビットに収まるなら、それが成立します。

    [1] https://hal.univ-lorraine.fr/inria-00070403v1

  2. BiraIgnacio

    > 整数除算q=(x/y)と(ユークリッド除算の)剰余r=(x%y)のハードウェア操作は、現在のハードウェアでは非常に悲しい状態です。典型的にはレイテンシが非常に長く、スループットも低い。対照的に浮動小数点除算はかなり幸せです:レイテンシが短く、スループットが高く、多くの場合、より多くの実行ユニットがその操作を実行できます。

    ああ、これはいつからそうなったのか見逃していました。

  3. juancn

    これについて、実際的なシナリオでのベンチマークがあれば嬉しいです。

    多くの一般的なケースでは、シフトとマスキングが整数除算を置き換えることができ(例:ハッシュテーブル)、除算を完全に回避できます。そしてそれはおそらく、intをfloatに変換するのとほぼ同じコストでしょう。

この日のほかの記事

2026-08-14