說明:
y = x2
y = x3
#!/usr/bin/perl
# 求某值開方
my $sqrtNum = 2.0000;
# 開 n 次方,n = 2
my $sqrtSeed = 2;
if ($#ARGV >= 0) {
$sqrtNum = $ARGV[0];
}
# 基底數
# 用遞減法估算,與 n 次方差數最接近 1 之基底數
my $baseNum = $sqrtNum / $sqrtSeed;
while ($baseNum ** $sqrtSeed - $sqrtNum > 1.0000) {
$baseNum--;
}
# 上限數
my $limitNum = $baseNum + $baseNum / $sqrtSeed;
my $tempNum = 0.0000;
my $baseSqrNum = $baseNum ** $sqrtSeed;
my $limitSqrNum = $limitNum ** $sqrtSeed;
while ($limitSqrNum - $sqrtNum > 0.0001) {
$tempNum = $baseNum + ($limitNum - $baseNum) / $sqrtSeed;
if ($tempNum ** 2 > $sqrtNum) {
# 上限數仍過大
$limitNum = $tempNum;
}
else {
# 上限數已過低
$baseNum = $tempNum;
}
# 精密度已夠
if ($limitNum - $baseNum <= 0.0001) { last; }
$baseSqrNum = $baseNum ** $sqrtSeed;
$limitSqrNum = $limitNum ** $sqrtSeed;
printf("%02d: %.5f~%.5f (%.5f)\n", ( ++$times, $baseNum, $limitNum, $limitSqrNum ));
}
printf("%.5f (%.5f)\n", ($limitNum, $limitSqrNum));