exp
(PHP 4, PHP 5)
exp — Вычисляет число e
в степени
Описание
float exp
( float
$arg
)
Возвращает e
в степени arg
.
Замечание:
Число
e
- основание натурального логарифма. Приблизительно равно 2.718282.
Список параметров
-
arg
-
Степень для возведения
Возвращаемые значения
'e' возводится в степень arg
Примеры
Пример #1 Пример использования exp()
<?php
echo exp(12) . "\n";
echo exp(5.7);
?>
Результат выполнения данного примера:
1.6275E+005 298.87
- PHP Руководство
- Функции по категориям
- Индекс функций
- Справочник функций
- Математические расширения
- Математические функции
- abs
- acos
- acosh
- asin
- asinh
- atan2
- atan
- atanh
- base_convert
- bindec
- ceil
- cos
- cosh
- decbin
- dechex
- decoct
- deg2rad
- exp
- expm1
- floor
- fmod
- getrandmax
- hexdec
- hypot
- intdiv
- is_finite
- is_infinite
- is_nan
- lcg_value
- log10
- log1p
- log
- max
- min
- mt_getrandmax
- mt_rand
- mt_srand
- octdec
- pi
- pow
- rad2deg
- rand
- round
- sin
- sinh
- sqrt
- srand
- tan
- tanh
Коментарии
Note regarding the mathematical function exp(x):
To continue accuracy of the exponential function to an infinite amount of decimal places, one would use the power series definition for exp(x).
(in LaTeX form:)
e^x = \sum_{n=0}^{\infty} \frac{x^n}{n!}
So, to do that in PHP (using BC math):
<?php
// arbitrary precision function (x^n)/(n)!
function bcpowfact($x, $n) {
if (bccomp($n, '0') == 0) return '1.0';
if (bccomp($n, '1') == 1) return $x;
$a = $x; // nth step: a *= x / 1
$i = $n;
while (bccomp($i, '1') == 1) {
// ith step: a *= x / i
$a = bcmul($a, bcdiv($x, $i));
$i = bcsub($i, '1'); // bc idiom for $i--
}
return $a;
}
// arbitrary precision exp() function
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;
}
?>
working version (checked) of below code is
<?php
// see bccomp for this code (signed and unsigned zero!)
function bccomp_zero($amount) {
return bccomp($amount, (@$amount{0}=="-"?'-':'').'0.0');
}
// arbitrary precision function (x^n)/(n)!
function bcpowfact($x, $n) {
if (bccomp_zero($n) == 0) return '1';
if (bccomp($n, '1') == 0) return $x;
$a = $x; // 1st step: a *= x / 1
$i = $n;
while (bccomp($i, '1') == 1) {
// ith step: a *= x / i
$a = bcmul($a, bcdiv($x, $i));
$i = bcsub($i, '1'); // bc idiom for $i--
}
return $a;
}
// arbitrary precision exp() function
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 idiom for $n++
} while (bccomp(bcsub($sum, $prev_sum), $error) == 1);
return $sum;
}
?>
Just a note about using the submitted codes below..
Their functions have an optional $precision parameter; however, it's not being used properly..
BCMath functions by default do not use decimal precision unless specified by BCScale($precision); or using the extra parameter in the used BC functions.
For example, a blank PHP file with their code.. executing BCExp('5.7'); returns "47" instead of the correct answer of "298.86740096706..."
So for optimum accuracy, I'd suggest setting BCScale to a healthy length before running their codes.
PHP does not have the following math function in any extensions:
frexp() - Extract Mantissa and Exponent of the Floating-Point Value
I've digged many C source codes, and found the simplest implementation as follows:
<?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));
?>
Array
(
[0] => 0.552
[1] => -4
)
Array
(
[0] => 0.67309375
[1] => 5
)
I have compared the results using a lot of floats against C's frexp function - they are the same.
Note that C and PHP uses different float precisions, for example "4619.3" gives:
C: 0.56387939453125, 13
PHP: 0.563879394531, 13
/Assuming default configurations./