アカウント名:
パスワード:
乗算命令が遅くないCPUなら、愚直に商を求めてからその10倍の数を引いちゃうって手もあり?
2桁までだし、Z80のコードですが、yasuoka氏のZ80のコード [srad.jp]だと、10で割った商と余りを求めるのに最初は「10で割る(商)」→「10倍して引く(余り)」という流れで計算してましたが、最終的には、・まず10で割った余りを求める・元の数から余りを引いて、10の倍数にする・10で割って商を求めるって流れで計算してますね。最後の10で割るとこは、「余りを引けば、得られる値は全て10の倍数になる。10=8+2をうまく使えば、商の計算は基本的にビット操作に落とせる」んだそうですが、Z80のコードみても、なぜそれで商になるのか私にはさっぱりわからない…
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
アレゲは一日にしてならず -- アレゲ研究家
ちゃんと検証してませんが (スコア: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: (スコア:1)
2桁までだし、Z80のコードですが、yasuoka氏のZ80のコード [srad.jp]だと、10で割った商と余りを求めるのに
最初は「10で割る(商)」→「10倍して引く(余り)」という流れで計算してましたが、
最終的には、
・まず10で割った余りを求める
・元の数から余りを引いて、10の倍数にする
・10で割って商を求める
って流れで計算してますね。
最後の10で割るとこは、「余りを引けば、得られる値は全て10の倍数になる。10=8+2をうまく使えば、商の計算は基本的にビット操作に落とせる」んだそうですが、Z80のコードみても、なぜそれで商になるのか私にはさっぱりわからない…
Re:ちゃんと検証してませんが (スコア:1)
yasuoka先生のコードはfloor(n/8)の8倍をBCDで得て(ADD A/DAA 3回はコレ)、n mod 8を足してもう一回BCDに補正するという座組です。10進補正命令があるからの技だと言わざるを得ません。
// 255/10から商=25、あまり=5が欲しいので足りませんでした