私は現在、高速の32.32固定小数点数学ライブラリを作成しています。足し算、引き算、掛け算は正しく動作するようになりましたが、除算にかなりこだわっています。
思い出せない人へのちょっとした注意:32.32固定小数点数は、32ビットの整数部分と32ビットの小数部分を持つ数です。
私が思いついた最高のアルゴリズムには、96ビットの整数除算が必要です。これは、コンパイラーには通常組み込まれていないものです。
とにかく、ここに行きます:
G = 2^32
notation: x is the 64-bit fixed-point number, x1 is its low nibble and x2 is its high
G*(a/b) = ((a1 + a2*G) / (b1 + b2*G))*G // Decompose this
G*(a/b) = (a1*G) / (b1*G + b2) + (a2*G*G) / (b1*G + b2)
ご覧のとおり、(a2*G*G)
は通常の64ビット整数よりも大きいことが保証されています。uint128_tが実際にコンパイラでサポートされている場合は、次のようにします。
((uint128_t)x << 32) / y)
そうではなく、解決策が必要です。ご協力ありがとうございました。