您如何编写自己的函数以查找最精确的整数平方根?
谷歌搜索之后,我发现了它(从其原始链接存档),但是首先,我没有完全了解它,其次,它也是近似的。
假设平方根是最接近的整数(实际根数)或浮点数。
以下计算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()函数仅指示应使用常规整数除法)。