分享 PHP 中开立方根 Cubic Root 的几种算法
PHP 中有自带的平方根函数,但是没有立方根函数,所以我们只有自己用算法/函数实现了,其实这些算法在网上也有,我们无需了解其运行的原理,只要会用就可以了。
二分猜测法
效率比较低,需要 50 次循环左右才能算 64bits 精度。
function croot($num){
$num=$root=floatval($num);
$gap=abs($num);
$loop=50;
for($i=0;$i<$loop;$i++){
$gap/=2;
$powered=$root*$root*$root;
if($powered>$num)
$root-=$gap;
elseif($powered<$num)
$root+=$gap;
else
return $root;
}
return $root;
}
可控制精度的版本:
function croot($num){
$num=$root=floatval($num);
$gap=abs($num);
while(true){
$gap/=2;
$powered=$root*$root*$root;
if(abs($powered-$num)<0.000000000001){
return $root;
}else{
if($powered>$num){
$root-=$gap;
}elseif($powered<$num){
$root+=$gap;
}else{
return $root;
}
}
}
}
牛顿-拉佛孙法
利用牛顿-拉佛孙法 Newton–Raphson method 公式 循环 10 次内算出结果。效率还可以。
递归版本
$guess 为任意初始值,$x 为需求根的乘方值
function croot2($guess,$x){
$try=abs($guess*$guess*$guess-$x);
if($try<0.0000000001){
return $guess;
}else{
return croot2(($x/$guess/$guess+2*$guess)/3,$x);
}
}
循环版本
function croot3($num){
$guess=$num/3;
while(abs($guess*$guess*$guess-$num)>=0.0000000001){
$guess=($num/$guess/$guess+2*$guess)/3;
}
return $guess;
}
哈雷法
利用哈雷法 Halley's Method 公式 循环 5 次就能得到结果,算法效率最优。
function croot4($num){
$guess=$num/3;
while(true){
$try=$guess*$guess*$guess;
if(abs($try-$num)>=0.0000000001)
$guess=$guess*(($try+2*$num)/(2*$try+$num));
else
return $guess;
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论