分享 PHP 中开立方根 Cubic Root 的几种算法

发布于 2019-09-19 19:12:08 字数 2459 浏览 2352 评论 0

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

JSmiles

生命进入颠沛而奔忙的本质状态,并将以不断告别和相遇的陈旧方式继续下去。

0 文章
0 评论
84961 人气
更多

推荐作者

胡图图

文章 0 评论 0

zt006

文章 0 评论 0

z祗昰~

文章 0 评论 0

冰葑

文章 0 评论 0

野の

文章 0 评论 0

天空

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文