为了新算法,啃了一段时间cordic算法,终于搞懂了。结合一些资料,琢磨出了以下的算法
根据欧拉公式有

将求自然对数的问题转换成求反双曲正切
那么就可以用cordic算法算出反双曲正切
设置x1=1, y1=(q-1)/(q+1), z1=0
代入一下方程进行旋转

多次旋转后,
arctanh((q-1)/(q+1))≈z
则lnq≈2z
因为arctanh(2^-0)=∞,所以n就从1开始了。因此z只能收敛到1左右。。也就是说
计算lnq, q只能小于e。。
根本不能满足。。
然后我发现如果在二进制的背景下将公式改写成求log2(q)的公式,z的值就可以轻易扩展。
将q向小方向移m位得到q', 使q'小于2大于等于1
同样
设置x1=1, y1=(q'-1)/(q'+1), z1=0

log(2)(q')≈2z
log(2)(q)≈2z+m
这样就可以轻易扩展。
that's all
通过一次除法,和一堆加减法即可计算出任意位数的log(2)(x)
我脑补了下这个对数器在mc中的样子,感觉形状绝对很不友好
然而我弟最近这几天老缠着我,根本没法做。所以我就先把算法放出来造福社会。
以前那个算法是用初中知识做的。。延迟略大,以后有机会在讲
根据欧拉公式有

将求自然对数的问题转换成求反双曲正切
那么就可以用cordic算法算出反双曲正切
设置x1=1, y1=(q-1)/(q+1), z1=0
代入一下方程进行旋转

多次旋转后,
arctanh((q-1)/(q+1))≈z
则lnq≈2z
因为arctanh(2^-0)=∞,所以n就从1开始了。因此z只能收敛到1左右。。也就是说
计算lnq, q只能小于e。。

根本不能满足。。
然后我发现如果在二进制的背景下将公式改写成求log2(q)的公式,z的值就可以轻易扩展。
将q向小方向移m位得到q', 使q'小于2大于等于1
同样
设置x1=1, y1=(q'-1)/(q'+1), z1=0

log(2)(q')≈2z
log(2)(q)≈2z+m
这样就可以轻易扩展。

that's all
通过一次除法,和一堆加减法即可计算出任意位数的log(2)(x)
我脑补了下这个对数器在mc中的样子,感觉形状绝对很不友好

然而我弟最近这几天老缠着我,根本没法做。所以我就先把算法放出来造福社会。
以前那个算法是用初中知识做的。。延迟略大,以后有机会在讲