一尘不染

编写自己的平方根函数

algorithm

您如何编写自己的函数以查找最精确的整数平方根?

谷歌搜索之后,我发现了(从其原始链接存档),但是首先,我没有完全了解它,其次,它也是近似的。

假设平方根是最接近的整数(实际根数)或浮点数。


阅读 138

收藏
2020-07-28

共1个答案

一尘不染

以下计算N> 0的floor(sqrt(N)):

x = 2^ceil(numbits(N)/2)
loop:
    y = floor((x + floor(N/x))/2)
    if y >= x
        return x
    x = y

这是Crandall&Pomerance的“素数:一种计算视角”中给出的牛顿方法的一种形式。使用此版本的原因是,知道自己在做什么的人已经证明它完全收敛于平方根的底面,而且它很简单,因此实现错误的可能性很小。它也很快(尽管可以构造甚至更快的算法,但是正确地执行则要复杂得多)。对于很小的N,正确实施的二进制搜索可能会更快,但是您也可以在其中使用查找表。

要舍入到 最接近的 整数,只需使用上述算法计算t = floor(sqrt(4N))。如果设置了t的最低有效位,则选择x =(t + 1)/ 2;
否则选择t / 2。请注意,这四舍五入。您还可以通过查看余数是否为非零(即t ^ 2 == 4N)来舍入(或舍入为偶数)。

请注意,您不需要使用浮点运算。实际上,您不应该这样。该算法应完全使用整数来实现(特别是floor()函数仅指示应使用常规整数除法)。

2020-07-28