本文介绍了在PHP中使用bcmath计算第N个根的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我们正在寻找PHP中的第N个根.我们需要使用一个非常大的数字来执行此操作,而Windows计算器将返回2.通过以下代码,我们将得到1.

We are looking for the Nth root in PHP. We need to do this with a very large number, and the windows calculator returns 2. With the following code we are getting 1. Does anybody have an idea how this works?

echo bcpow(18446744073709551616, 1/64);

推荐答案

好吧,似乎PHP和BC lib有一些限制,并且在互联网上搜索后,我发现了这个有趣的文章/代码:

Well it seems that PHP and the BC lib has some limits, and after searching on the internet i found this interesting article/code:

因此,您应该使用此功能:

So you should use this function:

<?php

function NRoot($num, $n) {
    if ($n<1) return 0; // we want positive exponents
    if ($num<=0) return 0; // we want positive numbers
    if ($num<2) return 1; // n-th root of 1 or 2 give 1

    // g is our guess number
    $g=2;

    // while (g^n < num) g=g*2
    while (bccomp(bcpow($g,$n),$num)==-1) {
        $g=bcmul($g,"2");
    }
    // if (g^n==num) num is a power of 2, we're lucky, end of job
    if (bccomp(bcpow($g,$n),$num)==0) {
        return $g;
    }

    // if we're here num wasn't a power of 2 :(
    $og=$g; // og means original guess and here is our upper bound
    $g=bcdiv($g,"2"); // g is set to be our lower bound
    $step=bcdiv(bcsub($og,$g),"2"); // step is the half of upper bound - lower bound
    $g=bcadd($g,$step); // we start at lower bound + step , basically in the middle of our interval

    // while step!=1

    while (bccomp($step,"1")==1) {
        $guess=bcpow($g,$n);
        $step=bcdiv($step,"2");
        $comp=bccomp($guess,$num); // compare our guess with real number
        if ($comp==-1) { // if guess is lower we add the new step
            $g=bcadd($g,$step);
        } else if ($comp==1) { // if guess is higher we sub the new step
            $g=bcsub($g,$step);
        } else { // if guess is exactly the num we're done, we return the value
            return $g;
        }
    }

    // whatever happened, g is the closest guess we can make so return it
    return $g;
}

echo NRoot("18446744073709551616","64");

?>

希望这很有帮助...

Hope this was helpful ...

这篇关于在PHP中使用bcmath计算第N个根的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-20 04:31
查看更多