2

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

我正在尝试找到一种解决方案,以在 PHP 中以 20 个小数点的精度执行以下操作

9999999999999999999999999^0.2222

内置函数/GMP/BC Math 无助于做到这一点。由于大小有限,内置函数会失败。GMP 和 BC 数学不接受十进制指数。

我可以在 stackoverflow 中找出一些算法来解释如何做到这一点,但仅限于整数部分的准确性。

我什至觉得这对 PHP 来说是不可能的,除非我们想出一个算法来破解它

4

2 回答 2

2

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

  1. BCMath 库包含一个sqrt函数
  2. 您可以闯入pow(x, a)BCMath库pow(x, int(a)) * fracpow(x, frac(a))中存在的位置,并且是我们需要创建的函数(对于0 和 1 之间的指数)powfracpowa
  3. 派系力量可以表示为多个平方根的乘积:

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

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

  1. 找到指数的小数部分
  2. 用 2 的幂表示(基本上是二进制表示)
  3. 继续取你的号码的平方根
  4. 每次应包含您的因素时,将您的结果乘以新的平方根

这不是一个快速的方法,我怀疑您在中间阶段需要更多的精度,以确保最终结果的足够精度。但它会工作......

如果您需要帮助来实现这一点,请告诉我 - 我可能有时间稍后(或者其他查看此答案的人之一可能会受到启发来编写代码)。

于 2013-09-30T13:38:44.620 回答
0

您可以使用 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");
    ?>

祝你今天过得愉快

于 2013-09-30T13:38:22.257 回答