PHP的一个数字的力量

时间:2013-09-30 12:48:02

标签: php math

我一直在寻找答案,但没有运气

我试图找到一个解决方案来执行以下操作,在PHP中精确到20个小数点

9999999999999999999999999 ^ 0.2222

在内置函数/ GMP / BC Math中没有帮助。在内置函数中,只是因为大小有限而失败。 GMP和BC数学不接受十进制指数。

我可以在stackoverflow中找出一些解释如何执行此操作的算法,但仅限于整数部分的准确性。

我甚至认为,除非我们想出一个破解这个的算法

,否则PHP是不可能的

2 个答案:

答案 0 :(得分:2)

我想我有办法。它取决于三个简单的观察结果:

  1. BCMath库包含sqrt函数
  2. 您可以将pow(x, a)分成pow(x, int(a)) * fracpow(x, frac(a)),其中pow存在于BCMath库中,fracpow是我们需要创建的函数(对于指数a 0到1之间)
  3. 派系权力可以表示为多个平方根的乘积:

    x^(0.22) = x^(1/8 + 1/16 + 1/32 + ...) = sqrt(sqrt(sqrt(x)))) * sqrt(sqrt(sqrt(sqrt(x)))) * ...

  4. 换句话说 - 采取的方法如下:

    1. 找到指数的小数部分
    2. 以2的幂表示(二进制表示,基本上)
    3. 继续使用数字的平方根
    4. 每次应包含因子时,将结果乘以新的平方根
    5. 这不是一种快速的方法,我怀疑在中间阶段你需要更多的精度数字,以确保最终结果的足够精确度。但它会起作用......

      如果你需要帮助实现这一点让我知道 - 我可能会有时间(或者其他一个看这个答案的人可能会受到启发来编写代码)。

答案 1 :(得分:-1)

您可以使用wolframalpha来计算不可能的数学问题。

    <?php
        function pow_a($a,$b){
        $a = file_get_contents("http://www.wolframalpha.com/input/?i=$a"."%5E"."$b");
        if(preg_match_all('/first\sbtn\"\>\<a\shref\=\"(.*?)\"/', $a, $m))
            $b = file_get_contents("http://www.wolframalpha.com/input/".htmlspecialchars_decode($m[1][0]));
            if(preg_match_all("/\"stringified\"\:\s\"(.*?)\.\.\./i", $b, $k))
                return $k[1][0];
        }
        echo pow_a("9999999999999999999999999", "0.2222");
    ?>

度过愉快的一天