文字

exp

(PHP 4, PHP 5)

exp计算 e 的指数

说明

float exp ( float $arg )

返回 e arg 次方值。

Note:

用 ' e ' 作为自然对数的底 2.718282.

参数

arg

要处理的参数

返回值

'e' raised to the power of arg

范例

Example #1 exp() 例子

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

以上例程会输出:

1.6275E+005
298.87

参见

  • log() - 自然对数
  • pow() - 指数表达式

用户评论:

[#1] Mohammed AbdelRahman [2014-08-31 04:18:53]

Which is the inverse of log(float $arg, e)

[#2] zooly at globmi dot com [2010-12-14 07:12:58]

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($float2)) + );
  
$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./

[#3] Nitrogen [2009-09-23 17:54:20]

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.

[#4] konrad [2007-01-24 15:13:12]

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($abcdiv($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($sumbcpowfact($x$n));
      
$n bcadd($n'1'); // bc idiom for $n++
    
} while (bccomp(bcsub($sum$prev_sum), $error) == 1);
    return 
$sum;
  }
?>

[#5] boards at gmail dot com [2006-04-26 10:18:14]

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($abcdiv($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($sumbcpowfact($x$n));
  }
  while (
bccomp(bcsub($sum$prev_sum), $error) == 1);
  return 
$sum;
}
?>

上一篇: 下一篇: