从固定点计算平方根

时间:2013-06-03 06:58:19

标签: c++ fixed-point square-root

我一直在尝试从固定点数据类型<24,8>计算平方根。
不幸的是,似乎没有任何工作。
有没有人知道如何快速有效地执行此操作C(++)?

1 个答案:

答案 0 :(得分:3)

这是python中的原型,展示了如何在固定点using Newton's method.

中执行平方根
import math

def sqrt(n, shift=8):
     """
     Return the square root of n as a fixed point number.  It uses a
     second order Newton-Raphson convergence.  This doubles the number
     of significant figures on each iteration.

     Shift is the number of bits in the fractional part of the fixed
     point number.
     """
     # Initial guess - could do better than this
     x = 1 << shift // 32 bit type
     n_one = n << shift // 64 bit type
     while 1:
         x_old = x
         x = (x + n_one // x) // 2
         if x == x_old:
             break
     return x

def main():
    a = 4.567
    print "Should be", math.sqrt(a)
    fp_a = int(a * 256)
    print "With fixed point", sqrt(fp_a)/256.

if __name__ == "__main__":
    main()

将此转换为C ++时要非常小心这些类型 - 特别是n_one需要是64位类型,否则它会在<<8位步骤溢出。另请注意,//是python中的整数除法。