当前位置: 代码迷 >> 汇编语言 >> 再推导一次X/N=INT(H/N)*65536+[REM(H/N)*65536+L]/N,欢迎扔砖头,该怎么解决
  详细解决方案

再推导一次X/N=INT(H/N)*65536+[REM(H/N)*65536+L]/N,欢迎扔砖头,该怎么解决

热度:4485   发布时间:2013-02-26 00:00:00.0
再推导一次X/N=INT(H/N)*65536+[REM(H/N)*65536+L]/N,欢迎扔砖头
REM(A/B)=A/B的余数
INT(A/B)=A/B的商
求证:
X/N=INT(H/N)*65536+[REM(H/N)*65536+L]/N
(此情况为溢出时)
X/N因为会溢出,所以可以把X分成高位和低位
即H和L
则X/N=(H*65536+L)/N
  =(H/N)*65536+(L/N)
因为在debug里是看不到分数的
所以只有商和余数
而(H/N)*65536中,如果(H/N)得到的是分数
那么就会有余数,那么(H/N)怎么办?只能拿他的商来进行*65536?
那就会损失余数*65536的误差
所以只好把H拆分
我们知道H/N=A……B
那么H=AN+B
于是原式=[(AN+B)/N]*65536+(L/N)
  =(A+B/N)*65536+(L/N)
  =65536A+65536*B/N+L/N
  =65536A+(65536B+L)/N
这时有人会疑问(65536B+L)/N如果得到的是分数那又怎么办?
(65536B+L)/N=C……D
65536B+L=CN+D
原式=65536A+(CN+D)/N
  =65536A+C+D/N
我们知道余数比除数小
所以D<N
那么D/N的商为0,余数为D
而我们的要求是求X/N的商,如果有余数
那么这个余数会小于N,
而上面已知D<N
所以X/N和65536A+C+D/N的误差是一样的(即D/N的余数就是X/N余数)
因为只取商
所以原式=65536A+C+0
  =65536A+C
  =65536A+(65536B+L)/N的商
所以X/N=INT(H/N)*65536+[REM(H/N)*65536+L]/N
也可以写成X/N=INT(H/N)*65536+INT{[REM(H/N)*65536+L]/N}
本人仅为初中水平,可能错漏百出,我也是无聊才写这东西,欢迎大家喷!

------解决方案--------------------------------------------------------
顶·~~
------解决方案--------------------------------------------------------
up!!
------解决方案--------------------------------------------------------
探讨
希望你能说说10进制的理解方法
  相关解决方案