Algorithm 从整数和余数求平方根作为浮点?

Algorithm 从整数和余数求平方根作为浮点?,algorithm,math,square-root,Algorithm,Math,Square Root,我现在正在研究计算平方根的特殊算法,它返回平方根的整数部分和余数 例如:mysqrt(140)=11*11+19=整数11,余数19 问题是,我可以将平方根计算为浮点值吗?例如,140的平方根是~11.8321 根据评论编辑 我正在研究定点平方根的VHDL实现,它只使用诸如左/右移位、加法和减法之类的二进制操作 …算法就足够了 编辑2我实际上在这里阅读这个算法: 似乎将半径D向左移动2n可以获得更好的精度。我不太清楚为什么会这样?谁能给我解释一下吗?我不确定我是否理解你的问题。您想知道如何在浮点

我现在正在研究计算平方根的特殊算法,它返回平方根的整数部分和余数

例如:
mysqrt(140)=11*11+19=整数11,余数19

问题是,我可以将平方根计算为浮点值吗?例如,140的平方根是~11.8321

根据评论编辑

我正在研究定点平方根的VHDL实现,它只使用诸如左/右移位、加法和减法之类的二进制操作

…算法就足够了

编辑2我实际上在这里阅读这个算法:


似乎将半径D向左移动2n可以获得更好的精度。我不太清楚为什么会这样?谁能给我解释一下吗?我不确定我是否理解你的问题。您想知道如何在浮点上使用sqrt函数,还是自己编写

如果是前者,那么您的语言将提供一些东西(可能称为sqrt())。如果是后者,那么你需要查找一些数字资源。我建议GSL:

要解决这个问题,您需要执行另一个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
您可以重复应用此方法以获得更好的近似值,但可能更快。

响应:

似乎将半径D向左移动2n可以获得更好的精度。我不太清楚为什么会这样?谁能给我解释一下吗

你链接的那篇文章谈到了2n的左移。它之所以有效,是因为你有效地移动了4的倍数,这很容易计算成平方根

sqrt(K*2^2n) = sqrt(K)*sqrt(2^2n) = sqrt(K)*2^n
所以你只要向后移动n位,你就能得到正确的答案。如果你把这些移位的位保留为小数部分,那么你就得到了分数答案

从十进制角度考虑,在平方根之前乘以100,在平方根之后除以10

所以


其中sqrt(200)只给出一个整数。

我已经修复了看起来像打字错误的(
余数9
,而不是
19
)。这基本上等于是编写自己的。编程语言还是算法?@ChrisBD,算法就足够了。很明显,你可以,但你限制自己做什么操作?大概您不想使用完整的sqrt运算符。有些算法使用估计和余数计算平方根。是这样的。不,我知道如何使用:)我没有使用已经实现的系统sqrt,而是使用另一种算法,返回数字的整数部分和余数(参见示例),因此给定int part=11和余数=19,浮点等价物是什么?它实际上是完全不同的。我正在看定点平方根的VHDL实现,它只使用诸如左/右移位、加法和减法之类的二进制操作。为了澄清,这证明了您的问题的答案是否定的,给定整数和余数,您无法计算浮点平方根。(至少这是我从中得到的…@Ishtar,对不起,我认为有一个明显的(简单的)解决方案,但我当时没有看到。谢谢@Chris的精彩解释!我会的,我可以接受你的回答和伊什塔的回答。
sqrt(K*2^2n) = sqrt(K)*sqrt(2^2n) = sqrt(K)*2^n
sqrt(2) = sqrt(200)/10 = 14/10 = 1.4