我以前使用过的例程(不知道它是否是一个“适当的”例程)是一种分而治之的方法。
您从一个任意的上限值和下限值(分别为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