乘法,除法,开方的简单实现
这些实现方法都是基于二进制来完成的,很容易用计算机的简单指令实现。
乘法通过shift和add来实现:
function void init() { let tt = Array.new(16); tt[0] = 1; tt[1] = 2; tt[2] = 4; tt[3] = 8; tt[4] = 16; tt[5] = 32; tt[6] = 64; tt[7] = 128; tt[8] = 256; tt[9] = 512; tt[10] = 1024; tt[11] = 2048; tt[12] = 4096; tt[13] = 8192; tt[14] = 16384; tt[15] = 32768; } funcetion int multiply(int x, int y) { int sum, shift, i; let sum = 0; let shift = x; let i = 0; while (i < 16) { if (bit(x, i)) { sum = sum + shift; } i = i + 1; shift = shift + shift; } }
除法实现类似于10进制的长除法,只不过除数使用二进制向上试探。其中 `_div2` 这种实现可以减少一次乘法调用,但是需要多一个存储空间。
def _div1(x, y): if x < y: return 0 q = _div1(x, 2 * y) q2 = q * 2 qy2 = q2 * y if (x - qy2) < y: pass else: q2 += 1 return q2 def _div2(x, y): if x < y: return 0, 0 q, qy2 = _div2(x, 2 * y) q2 = q * 2 # qy2 = q * 2 * y = q2 * y if (x - qy2) < y: pass else: q2 += 1 # 如果这里q2 += 1的话,那qy2需要+y qy2 += y return q2, qy2 def div(x, y): q1 = _div1(x, y) q2, _ = _div2(x, y) assert q1 == q2 return q2
开方实现则是通过二分法来实现的
def sqrt(x): v = 0 for i in reversed(range(32)): t = v + (1 << i) if (t * t) <= x: v = t return v