分享 PHP 中开立方根 Cubic Root 的几种算法 - 文章教程

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

发布于 2019-09-19 字数 2645 浏览 1981 评论 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 公式 分享 PHP 中开立方根 Cubic Root 的几种算法 循环 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 公式 分享 PHP 中开立方根 Cubic Root 的几种算法 循环 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;
    }
}

如果你对这篇文章有疑问,欢迎到本站 社区 发帖提问或使用手Q扫描下方二维码加群参与讨论,获取更多帮助。

扫码加入群聊

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

目前还没有任何评论,快来抢沙发吧!

关于作者

JSmiles

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

2583 文章
29 评论
84935 人气
更多

推荐作者

清风夜微凉

文章 1 评论 0

为你鎻心

文章 2 评论 0

xxhui

文章 0 评论 0

1PKOH46yx8j0x

文章 0 评论 0

Arthur

文章 0 评论 0