- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在为 bcmath
扩展编写一个包装器,而关于 bcpow()
的 bug #10116 特别烦人——它转换 $right_operand
($exp
) 到一个( native PHP,不是任意长度)整数,所以当您尝试计算平方根(或任何其他高于 的根时1
) 您总是以 1
而不是正确结果结束。
我开始寻找允许我计算数字的 n 次方根的算法,我的 found this answer 看起来非常可靠,实际上我使用 WolframAlpha 的 expanded the formula 并且我能够将它的速度提高大约 5%,同时保持结果。
这是一个模仿我的 BCMath 实现及其局限性的纯 PHP 实现:
function _pow($n, $exp)
{
$result = pow($n, intval($exp)); // bcmath casts $exp to (int)
if (fmod($exp, 1) > 0) // does $exp have a fracional part higher than 0?
{
$exp = 1 / fmod($exp, 1); // convert the modulo into a root (2.5 -> 1 / 0.5 = 2)
$x = 1;
$y = (($n * _pow($x, 1 - $exp)) / $exp) - ($x / $exp) + $x;
do
{
$x = $y;
$y = (($n * _pow($x, 1 - $exp)) / $exp) - ($x / $exp) + $x;
} while ($x > $y);
return $result * $x; // 4^2.5 = 4^2 * 4^0.5 = 16 * 2 = 32
}
return $result;
}
上面的 seems to work great 除非 1/fmod($exp, 1)
不产生整数。例如,如果 $exp
为 0.123456
,则其倒数将为 8.10005
并且 pow()
的结果为_pow()
会有点不同 (demo):
pow(2, 0.123456)
= 1.0893412745953
_pow(2, 0.123456)
= 1.0905077326653
_pow(2, 1/8)
= _pow(2, 0.125)
= 1.0905077326653
如何使用“手动”指数计算达到相同水平的准确度?
最佳答案
用于查找(正)数 a
的第 nth 根的算法是用于查找零的牛顿算法
f(x) = x^n - a.
这只涉及以自然数作为指数的幂,因此很容易实现。
使用指数 0 < y < 1
计算幂,其中 y
不是具有整数 1/n
的 n
形式。做模拟,求解
x^(1/y) - a == 0
将再次涉及计算具有非整数指数的幂,这正是我们要解决的问题。
如果 y = n/d
是有理数,分母 d
很小,那么问题很容易通过计算解决
x^(n/d) = (x^n)^(1/d),
但对于大多数理性的 0 < y < 1
来说,分子和分母都相当大,中间的 x^n
会很大,所以计算会占用大量内存并花费(相对)较长的时间。(对于 0.123456 = 1929/15625
的示例指数,还算不错,但是 0.1234567
会很费力。)
计算一般有理 0 < y < 1
的幂的一种方法是编写
y = 1/a ± 1/b ± 1/c ± ... ± 1/q
用整数 a < b < c < ... < q
和乘/除单个 x^(1/k)
。 (每个有理的 0 < y < 1
都有这样的表示,最短的这样的表示通常不涉及很多术语,例如
1929/15625 = 1/8 - 1/648 - 1/1265625;
在分解中仅使用加法会导致具有更大分母的更长表示,例如
1929/15625 = 1/9 + 1/82 + 1/6678 + 1/46501020 + 1/2210396922562500,
这样会涉及更多的工作。)
通过混合这些方法可以进行一些改进,首先通过 y
的连续分数展开找到一个接近有理逼近 y
的小分母 - 例如指数 1929/15625 = [0;8,9,1,192]
并使用前四个部分商产生近似 10/81 = 0.123456790123...
[注意10/81 = 1/8 - 1/648
, 最短分解为纯分数的部分和收敛] - 然后将余数分解为纯分数。
但是,一般来说,这种方法会导致计算大型 n
的第 nth 个根,如果最终结果的所需精度很高,这也会很慢并且会占用大量内存。
总而言之,exp
和log
的实现和使用大概更简单更快
x^y = exp(y*log(x))
关于php - 计算浮点幂 (PHP/BCMath),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10523113/
我在服务器上有两个版本的 PHP(Centos 6.8) - 5.6 和 7.1 我的 Nginx 使用 php7.1,它不是默认的 PHP 解释器。 经过一番与 yum 的斗争后,我安装了 php7
我在 Bash 脚本中有两个 GNU bc 函数。 BC_CEIL="define ceil(x) { if (x>0) { if (x%1>0) return x+(1-(x%1)) else re
假设我有 $foo = bcsub(bcdiv(1, 3, 20), 0.00001, 20); 它返回 0.33333333333333333333 如果我有 $foo = bcsub(bcdiv(
如果我想将多个值与 BCMath 一起添加,我可以这样做: $total_cost1 = bcadd($value1, $value2); $total_cost2 = bcadd($value3,
我正在为 bcmath 扩展编写一个包装器,而关于 bcpow() 的 bug #10116 特别烦人——它转换 $right_operand ($exp) 到一个( native PHP,不是任意长
这是我得到的 function bcln($n, $scale=10) { $iscale = $scale+3; $result = '0.0'; $i = 0; d
如何在服务器上安装 bcmath 模块?我试过了 yum update php-bcmath 但它说什么也没找到。 最佳答案 试试 yum install php-bcmath。如果仍然找不到任何东西
如何在服务器上安装 bcmath 模块?我试过了 yum update php-bcmath 但它说什么也没找到。 最佳答案 试试 yum install php-bcmath。如果仍然找不到任何东西
我正在使用 PHP 的 bcmath 库对定点数执行运算。我期望获得与 Python 的 Decimal 类相同的行为,但我很惊讶地发现以下行为: // PHP: $a = bcdiv('15.80'
如何在 BCMath 的 bcscale() 方法中获取比例集? 例子: bcscale(25); 如何获得 25?谢谢! 最佳答案 更新: As of PHP 7.3.0您可以不带参数调用 bcsc
我将如何在 CentOS 6 上安装/启用 PHP bcmath 模块? 我已经尝试过“yum install php-bcmath”并得到了这个错误: Error: Package: php-
我需要模仿 ceil() 的确切功能, floor()和 round() bcmath 数字上的函数,I've already found a very similar question但不幸的是th
我不知道,为什么我总是在这里出现奇怪的错误 :D。 最近我遇到了一个错误,最像是与 php7 的 PHP-bcmath 扩展有关。 扩展已安装在环境中,但未加载到系统中。 当我尝试安装扩展程序时,显示
我需要启用 BC Math,但我不想使用 --enable-bcmath 来启用它,主要是因为我不了解该路径。 有没有办法只使用 php.ini 来做到这一点? 最佳答案 据我所知,您必须使用 --e
我有一个安装了 ubuntu 14.04、php7.1-fpm 的 VPS 并运行了很长时间。 我正在尝试安装 php7.1-bcmath。它一直在说 E: Unable to locate pack
问候开发人员, 我正在尝试在我最近启动的开发服务器上为我的 PHP 项目使用 composer,但由于某种原因我无法使用。我成功安装了 composer,但是,当我尝试运行 require 命令时,出
我在 docker container 上运行一个 linux 实例.这是一个带有 php 5.6 的 debian:jessie。 我想安装bcmath模块,但是我没有成功。 有人知道怎么做吗? r
我正在尝试在 Ubuntu 14.4 上安装 php7.2-bcmath 包 sudo apt-get install php7.2-bcmath 但我一直收到这个错误: Reading packag
我们正在寻找 PHP 中的第 N 个根。我们需要用非常大的数字来执行此操作,Windows 计算器返回 2。使用以下代码我们得到 1。有人知道这是如何工作的吗? echo bcpow(18446744
是否有用于此目的的任何库函数,所以我不会手动执行并冒以 TDWTF 结尾的风险? echo ceil(31497230840470473074370324734723042.6); // Expect
我是一名优秀的程序员,十分优秀!