exp()
(PHP 4, PHP 5, PHP 7)
计算e
的指数
说明
exp(float $arg):float
返回e
的$arg次方值。
Note:用'
e
'作为自然对数的底 2.718282.
参数
- $arg
要处理的参数
返回值
'e' raised to the power of$arg
范例
Example #1exp()例子
<?php echo exp(12) . "\n"; echo exp(5.7); ?>
以上例程会输出:
1.6275E+005 298.87
参见
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; } ?>
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./
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.
Which is the inverse of log(float $arg, e)