我以前使用过的例程(我不知道它是否是“适当的”例程)是一种分而治之的方法。
您从一个任意的上限值和下限值开始(分别为 5 和 0 - 您想要找到的最高和最低平方根)并找到它们之间的中点。平方该值。
如果平方值大于您的目标,请将上限值设置为您的平方值。如果它较低,则设置较低的值。
重复直到平方值与您的查找值匹配,或者您已经执行了足够的迭代以达到您想要的准确度。
这是我在 perl 中拼凑的一个小版本:
#!/usr/bin/perl
my $val = shift;
my $max = 5;
my $min = 0;
my $iterations = 0;
my $maxiter = 40;
while(($max > $min) and ($iterations<$maxiter))
{
$iterations++;
my $diff = $min + ($max - $min) / 2;
my $square = $diff * $diff;
if($square == $val)
{
print "Square root found at $diff\n";
print "$iterations iterations\n";
exit(0);
} else {
if($square > $val)
{
$max = $diff;
} else {
$min = $diff;
}
}
}
my $diff = $min + ($max - $min) / 2;
print "Approximate square root after $iterations iterations: $diff\n";
这当然是使用浮点,但可以很容易地适应定点。您可以通过更改迭代限制来改变精度。每次迭代都比前一次更准确。
例如: - 求 9 的平方根:
Approximate square root after 40 iterations: 2.99999999999955
- or -
Approximate square root after 10 iterations: 3.00048828125
- or -
Approximate square root after 5 iterations: 3.046875
如果它找到了值 3,它当然会提前停止。
给它足够的迭代,它应该得到非常准确:
./sqrt.pl 0.00284
Square root found at 0.0532916503778969
59 iterations