2024 年 PHP Conference Japan

exp

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

exp計算 e 的指數

說明

exp(浮點數 $num): 浮點數

傳回 enum 次方。

注意:

e」是自然對數的底數,約為 2.718282。

參數

數字

要處理的參數

傳回值

'e' 的 num 次方

範例

範例 #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 Math)

<?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 檔案中使用他們的程式碼執行 `bcpow('5.7', '1')` 會返回「47」,而不是正確答案「298.86740096706...」。

因此,為了獲得最佳精度,我建議在執行他們的程式碼之前,將 `bcscale` 設定為一個足夠大的值。
To Top