我能想出的最佳答案是我可以使用身份:
x/3 = sum(n=1 to infinity) (x/2^(2n))
然后取前 n 项。使用 4 个术语,我得到:
(x/4)+(x/16)+(x/64)+(x/256)
这等于
x*0.33203125
这可能已经足够好了。
这依赖于硬件中免费的 2 的固定幂的乘法,然后我可以并行运行 2 的 3 个加法。
不过,任何更好的答案都会受到赞赏。
** 编辑**:结合使用这个和@dyslexicgruffalo 的答案,我制作了一个简单的c++ 程序,它迭代了各种序列并尝试了它们并记录了各种平均/最大错误。
我这样做是为了 0 <= x <= 189 (因为 189 是 2*c0.g + c1.g 当 g (即 6 位)最大时的值。
最短的良好序列(最大误差为 2,平均误差为 0.62)和 4 个操作是:
1 + x/4 + x/16 + x/64.
最大误差为 1,平均误差为 0.32,但操作次数为 6 的最佳序列是:
x/2 - x/4 + x/8 - x/16 + x/32 - x/64.
对于 5 位值(红色和蓝色),最大值为 31*3,上述序列仍然很好,但不是最好的。这些是:
x/4 + x/8 - x/16 + x/32 [max error of 1, average 0.38]
和
1 + x/4 + x/16 [max error of 2, average of 0.68]
(而且,幸运的是,上述序列都没有猜到一个太大的答案,因此即使它们并不完美,也不需要夹紧)