我一直在寻找这个的答案,但没有运气
我正在尝试找到一种解决方案,以在 PHP 中以 20 个小数点的精度执行以下操作
9999999999999999999999999^0.2222
内置函数/GMP/BC Math 无助于做到这一点。由于大小有限,内置函数会失败。GMP 和 BC 数学不接受十进制指数。
我可以在 stackoverflow 中找出一些算法来解释如何做到这一点,但仅限于整数部分的准确性。
我什至觉得这对 PHP 来说是不可能的,除非我们想出一个算法来破解它
我想我有办法。它取决于三个简单的观察:
sqrt
函数pow(x, a)
BCMath库pow(x, int(a)) * fracpow(x, frac(a))
中存在的位置,并且是我们需要创建的函数(对于0 和 1 之间的指数)pow
fracpow
a
派系力量可以表示为多个平方根的乘积:
x^(0.22) = x^(1/8 + 1/16 + 1/32 + ...) = sqrt(sqrt(sqrt(x)))) * sqrt(sqrt(sqrt(sqrt(x)))) * ...
换句话说 - 采取的方法如下:
这不是一个快速的方法,我怀疑您在中间阶段需要更多的精度,以确保最终结果的足够精度。但它会工作......
如果您需要帮助来实现这一点,请告诉我 - 我可能有时间稍后(或者其他查看此答案的人之一可能会受到启发来编写代码)。
您可以使用 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");
?>
祝你今天过得愉快