PHP Conference Japan 2024

exp

(PHP 4, PHP 5, PHP 7, PHP 8)

exp计算 e 的指数

描述

exp(float $num): float

返回 nume 次幂。

注意:

'e' 是自然对数系统的底数,大约为 2.718282。

参数

num

要处理的参数

返回值

num 的 'e' 次幂

示例

示例 #1 exp() 示例

<?php
echo exp(12) . "\n";
echo
exp(5.7);
?>

以上示例将输出

1.6275E+005
298.87

参见

添加注释

用户贡献注释 4 个注释

zooly at globmi dot com
13 年前
PHP 在任何扩展中都没有以下数学函数

frexp() - 提取浮点数的值的尾数和指数

我挖掘了许多 C 源代码,并找到了如下最简单的实现

<?php

function frexp ( $float ) {

$exponent = ( floor(log($float, 2)) + 1 );
$mantissa = ( $float * pow(2, -$exponent) );

return(
array(
$mantissa, $exponent)
);

}

print_r(frexp(0.0345));
print_r(frexp(21.539));

?>

数组
(
[0] => 0.552
[1] => -4
)
数组
(
[0] => 0.67309375
[1] => 5
)

我已经使用大量浮点数与 C 的 frexp 函数比较了结果 - 它们是一样的。

请注意,C 和 PHP 使用不同的浮点精度,例如“4619.3”给出

C:0.56387939453125,13
PHP:0.563879394531,13

/假设默认配置。/
boards at gmail dot com
18 年前
关于数学函数 exp(x) 的说明

为了将指数函数的精度继续到无限位小数,可以使用 exp(x) 的幂级数定义。
(以 LaTeX 形式:)
e^x = \sum_{n=0}^{\infty} \frac{x^n}{n!}

因此,在 PHP 中执行此操作(使用 BC 数学)

<?php
// 高精度函数 (x^n)/(n)!
function bcpowfact($x, $n) {
if (
bccomp($n, '0') == 0) return '1.0';
if (
bccomp($n, '1') == 1) return $x;
$a = $x; // 第 n 步:a *= x / 1
$i = $n;
while (
bccomp($i, '1') == 1) {
// 第 i 步:a *= x / i
$a = bcmul($a, bcdiv($x, $i));
$i = bcsub($i, '1'); // bc 中的 $i-- 的用法
}
return
$a;
}

// 高精度 exp() 函数
function bcexp($x, $decimal_places) {
$sum = $prev_sum = '0.0';
$error = bcdiv(bcpow('10', '-'.$decimal_places), 10); // 0.1*10^-k
$n = '0';
do {
$prev_sum = $sum;
$sum = bcadd($sum, bcpowfact($x, $n));
}
while (
bccomp(bcsub($sum, $prev_sum), $error) == 1);
return
$sum;
}
?>
konrad
17 年前
下面代码的工作版本(已检查)为

<?php
// 参考 bccomp 函数的代码(带符号和无符号零!)
function bccomp_zero($amount) {
return
bccomp($amount, (@$amount{0}=="-"?'-':'').'0.0');
}

// 高精度函数 (x^n)/(n)!
function bcpowfact($x, $n) {
if (
bccomp_zero($n) == 0) return '1';
if (
bccomp($n, '1') == 0) return $x;
$a = $x; // 第一步:a *= x / 1
$i = $n;
while (
bccomp($i, '1') == 1) {
// 第 i 步:a *= x / i
$a = bcmul($a, bcdiv($x, $i));
$i = bcsub($i, '1'); // bc 中的 $i-- 等价写法
}
return
$a;
}

// 高精度 exp() 函数
function bcexp($x, $digits) {
$sum = $prev_sum = '0.0';
$error = '0.'.str_repeat('0', $digits-1).'1'; // 0.1*10^-k
$n = '0.0';
do {
$prev_sum = $sum;
$sum = bcadd($sum, bcpowfact($x, $n));
$n = bcadd($n, '1'); // bc 中的 $n++ 等价写法
} while (bccomp(bcsub($sum, $prev_sum), $error) == 1);
return
$sum;
}
?>
Nitrogen
15 年前
关于使用下面提交的代码的一些说明。
它们的函数有一个可选的 $precision 参数;但是,它没有被正确使用。

BCMath 函数默认情况下不使用小数精度,除非通过 BCScale($precision) 指定;或在使用的 BC 函数中使用额外的参数。

例如,在一个空白的 PHP 文件中使用它们的代码…执行 BCExp('5.7'); 返回 "47" 而不是正确的答案 "298.86740096706..."。

因此,为了获得最佳精度,我建议在运行它们的代码之前将 BCScale 设置为一个合适的长度。
To Top