我正在寻找计算平方根的特定算法,它返回平方根的整数部分和余数。
例如:mysqrt(140) = 11*11 + 19 = integer 11, remainder 19
问题是我可以将平方根计算为浮点数,例如140的平方根是~11.8321 ....?
从评论中修改
我正在研究固定点平方根的VHDL实现,它只使用左/右移位,加法和减法等二进制运算。
...算法就足够了。
编辑2 我实际上在这里阅读此算法:http://pioneer.netserv.chula.ac.th/~achatcha/Publications/0012.pdf
通过将radicand向左移动2n,似乎可以获得更好的精度。我不太清楚为什么会这样?谁能请解释我
答案 0 :(得分:4)
(11+x)^2 = 140
11^2 + 2*11*x + x^2 = 140
2*11*x + x^2 = 19
x^2 + 2*11*x - 19 = 0
要解决这个问题,你需要做另一个sqrt:
x = -11 + sqrt((2*11)^2 + 4 * 19) / 2
或者最后的答案:
11+x = sqrt((2*11)^2 + 4 * 19) / 2
这并不比仅仅做
快sqrt(140)
如果您正在寻找快速近似值:
x^2 + 2*11*x - 19 = 0
x = (19 - x^2)/(2*11)
猜测x = 0.5,给出
x = 19/(2*11) - 0.5*0.5/(2*11) = 0.852272727
你可以反复应用这个来获得更好的近似值,但Newton's method可能更快。
答案 1 :(得分:1)
回应:
通过将radicand向左移动2n,似乎可以获得更好的精度。我不太清楚为什么会这样?谁能请解释我
你链接的论文谈到左移2n。它起作用的原因是因为你有效地移动了4的倍数,这很容易考虑到平方根。
sqrt(K*2^2n) = sqrt(K)*sqrt(2^2n) = sqrt(K)*2^n
所以你只需向后移动n位就可以得到正确的答案。如果你将那些移位的位保留为小数部分,那么你得到了小数答案。
用小数表示,在平方根之前乘以100,然后除以10。
所以
sqrt(2) = sqrt(200)/10 = 14/10 = 1.4
其中sqrt(200)只给出一个整数。
答案 2 :(得分:0)
我不确定我理解你的问题。您想知道如何在浮点数上使用sqrt函数,或者如何编写自己的函数?
如果是前者,那么你的语言会提供一些东西(可能叫做sqrt())。如果是后者,那么你需要查找某种数字资源。我会推荐GSL: http://www.gnu.org/software/gsl/