|
发表于 2023-10-2 16:25:33
|
显示全部楼层
好久没上来了!
其实觉得只要证明出3/2的试商误差不会超过2的话, 我觉得这个办法已经是可以结束了!
从整个除法来说. 这个3/2试商占的比例很低很低, 肯定不会超过1%时间. 甚至可能是千分之几,或者更低比例.
换句话来说. 即使试商优化至无需时间, 那实际对整体来说, 也是无关痛痒的.
至于是64位数据,还是128位甚至是192位, 这些在我看来, 都是非常细枝末节的事情.
能优化就优化, 没优化, 只要结果是准确,那就没有问题了!
既然提到优化, 我把所知道的3/2 算法一些优化简单提一下!
假定一下条件
现在求 abc/df (3位除以2位,结果是1位数字 , )
(一般来说, 估商 被除数舍弃尾数往上进1,除数直接舍弃位数, 则估商偏大 ,
被除数直接舍弃尾数,除数舍弃尾数往上进1, 则估商偏小
后面我习惯是往偏小的估算, 如果往偏大估算,则反过来就好了,区别不大
)
方法1:
f = ab/(d + 1) ;
abc = abc - df * f ;
至 abc < df为止, 这个优点是逻辑简单, 但是ab/(d+1) ,当d很小时,误差很大,因此可能需要迭代多次才能得到准确结果.
方法2:
k = 1/(df + 1) (k实际是小数, 存储时,可以先放大若干倍, 存储为整数, 这样就不会出现浮点数)
f = ab * k; (f是整数)
abc = abc - df * f
至 abc < df为止, 这个里面有个小小的分支,
就是k到底使用 1位有效数据还是2位有效数据,
1位速度快, 但是误差稍微更大, 有时可以少迭代一些次数,
2位 速度稍慢, 毕竟计算f时需要计算2 * 2的乘法,但是估商误差会极小, 测试过, 基本上1次就能差不多达到要求.自己取舍.
方法3:
这个似乎没什么人提到的, 不知道为什么.(或者可能是这个限制条件比较多, 应用范围不大)
就是 在基R很小的时候, 比如 是2进制, 3进制, 10进制, 等等, 一个机器位长能能保持 基的若干次(起码超过2次)幂的情况下, 可以做一些优化处理.
打个比方, 比如现在能存 10进制 的 4次幂,
那么 当d 很小, 比如 小于10的2次幂时,
那么可以把改写一下 abc , df这两个数,
ab = ab * 10^2 + c / 10^2;
d = d * 10^2 + f / 10^2 ;
f = ab / (d + 1) ;
abc = abc - df * f ;
这样做的根本原因在于 当除数变大时,自然而然, 试商时的误差就变小, 到时需要迭代的次数就自然变小.
有个原则就是 除数被除数放大时, 需要保证 被除数至多是2位数, 除数至多1位数,不一定是对半截断. 可以根据情况自行处理
PS: 这帖子居然吸引了梁宝宝过来! , 厉害厉害! |
|