a/b
と の 2 つの整数の比として表される (非負0 <= a < 2^m
としましょう) 有理数を取得しました0 < b < 2^n
。p
分母にビットのみを使用して、それをより小さな表現に丸めたいと思います。つまり、 、どこでのc/d
ような最大の数を見つけます。c/d <= a/b
0 < d < 2^p
例: の場合m=3, n=4, p=2
、 に4/7
切り捨て1/2
、 に5/7
切り捨て2/3
ます。
私の最初の衝動は、分母を だけ右にシフトしn-p
、1 がポップオフされた場合は 1 を追加し、分子を同じ量だけ右にシフトすることでした。これは 未満の結果を生成することが保証されてa/b
いますが、結果の最適性は保証されていません。たとえば、 に3/1
丸めます2/1
。
理想的には、除算やモジュラスなしでこれを行いたいのですが、それは実用的ではないかもしれません。m
、n
、およびp
数百に達する可能性があり、これは内側のループになるため、可能な限り非常に高速なものが必要です。