note 25110 added to function.log1p
| From: | php-general at lists dot php dot net | Date: | Wed, 11 Sep 2002 07:29:54 +0000 |
| Subject: | note 25110 added to function.log1p | ||
| Groups: | php.notes | ||
| Request: | Send a blank email to php-notes+get-36495@lists.php.net to get a copy of this message | ||
Note that the benefit of this function for small argument values is lost if PHP is compiled against
a C library that that not have builtin support for the log1p() function.
In this case, log1p() will be compiled by using log() instead, and the precision of the result will
be identical to log(1), i.e. it will always be 0 for small numbers.
Sample log1p(1.0e-20):
- returns 0.0 if log1p() is approximated by using log()
- returns something very near from 1.0e-20, if log1p() is supported by the underlying C library.
One way to support log1p() correctly on any platform, so that the magnitude of the expected result
is respected:
function log1p($x) {
return ($x>-1.0e-8 && $x<1.0e-8) ? ($x - $x*$x/2) : log(1+$x);
}
If you want better precision, you may use a better limited development, for small positive or
negative values of x:
log(1+x) = x - x^2/2 + x^3/3 - ... + (-1)^(n-1)*x^n/n + ...
(This serial sum converges only for values of x in [0 ... 1] inclusive, and the ^ operator in the
above formula means the exponentiation operator, not the PHP xor operation)
Note that log1p() is undefined for arguments lower than or equal to -1, and that the implied base of
the log function is the Neperian "e" constant.
--
http://www.php.net/manual/en/function.log1p.php
http://master.php.net/manage/user-notes.php?action=edit+25110
http://master.php.net/manage/user-notes.php?action=delete+25110
http://master.php.net/manage/user-notes.php?action=reject+25110