从int和余数中找到平方根作为浮点数?

时间:2012-01-17 12:10:14

标签: algorithm math square-root

我正在寻找计算平方根的特定算法,它返回平方根的整数部分和余数。

例如: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,似乎可以获得更好的精度。我不太清楚为什么会这样?谁能请解释我

3 个答案:

答案 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/