アカウント名:
パスワード:
乗算命令が遅くないCPUなら、愚直に商を求めてからその10倍の数を引いちゃうって手もあり?
GCCで最適化オプションを付けたらこんな感じのコードになった。
int64_t rax = (int32_t)((int64_t)x * 0x66666667 >> 34) - (x >> 31);int32_t edx = rax * 5; // lea edx, [rax+rax*4]return x - (edx + edx);
やはり10で割って10倍して元の数から引くという方針のようだ
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
コンピュータは旧約聖書の神に似ている、規則は多く、慈悲は無い -- Joseph Campbell
ちゃんと検証してませんが (スコア:1)
乗算命令が遅くないCPUなら、愚直に商を求めてからその10倍の数を引いちゃうって手もあり?
素直に書けば
n1 = n * 0xcccccccd >> 35 << 3;
だが、
乗算の結果の上位32ビットだけ使うことを考慮して
n1 = n * 0xcccccccd >> 32 & 0xfffffff8;
こう書いてもいいかも?
n1 += n1 >> 2
すなわち、商の8倍+2倍=10倍の数が得られた。
result = n - n1;
すなわち、元の数から商の10倍の数が引かれたので、剰余が得られた。
Re:ちゃんと検証してませんが (スコア:0)
GCCで最適化オプションを付けたらこんな感じのコードになった。
やはり10で割って10倍して元の数から引くという方針のようだ
Re:ちゃんと検証してませんが (スコア:1)