jason Mon Nov 11 00:21:35 2002 EDT Modified files: /php4/ext/standard math.c /php4/ext/standard/tests/math log.phpt Log: Add the ability to take the logarithm of any base by adding a base parameter to log() Added regression tests for the new form Index: php4/ext/standard/math.c diff -u php4/ext/standard/math.c:1.93 php4/ext/standard/math.c:1.94 --- php4/ext/standard/math.c:1.93 Thu Oct 24 15:15:40 2002 +++ php4/ext/standard/math.c Mon Nov 11 00:21:35 2002 @@ -19,7 +19,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: math.c,v 1.93 2002/10/24 19:15:40 helly Exp $ */ +/* $Id: math.c,v 1.94 2002/11/11 05:21:35 jason Exp $ */ #include "php.h" #include "php_math.h" @@ -520,19 +520,35 @@ /* }}} */ #endif -/* {{{ proto float log(float number) - Returns the natural logarithm of the number */ +/* {{{ proto float log(float number, [float base]) + Returns the natural logarithm of the number, or the base log if base is specified +*/ PHP_FUNCTION(log) { - zval **num; - - if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &num) == FAILURE) { - WRONG_PARAM_COUNT; + zval **num, **base; + + switch (ZEND_NUM_ARGS()) { + case 1: + if (zend_get_parameters_ex(1, &num) == FAILURE) { + WRONG_PARAM_COUNT; + } + convert_to_double_ex(num); + RETURN_DOUBLE(log(Z_DVAL_PP(num))); + case 2: + if (zend_get_parameters_ex(2, &num, &base) == FAILURE) { + WRONG_PARAM_COUNT; + } + convert_to_double_ex(num); + convert_to_double_ex(base); + + if (Z_DVAL_PP(base) <= 0.0) { + php_error(E_WARNING, "base must be greater than 0", +Z_DVAL_PP(base)); + RETURN_FALSE; + } + RETURN_DOUBLE(log(Z_DVAL_PP(num)) / log(Z_DVAL_PP(base))); + default: + WRONG_PARAM_COUNT; } - convert_to_double_ex(num); - Z_DVAL_P(return_value) = log(Z_DVAL_PP(num)); - Z_TYPE_P(return_value) = IS_DOUBLE; } /* }}} */ Index: php4/ext/standard/tests/math/log.phpt diff -u php4/ext/standard/tests/math/log.phpt:1.1 php4/ext/standard/tests/math/log.phpt:1.2 --- php4/ext/standard/tests/math/log.phpt:1.1 Sun Nov 10 22:45:04 2002 +++ php4/ext/standard/tests/math/log.phpt Mon Nov 11 00:21:35 2002 @@ -3,19 +3,42 @@ --POST-- --GET-- --FILE-- -<?php // $Id: log.phpt,v 1.1 2002/11/11 03:45:04 jason Exp $ +<?php // $Id: log.phpt,v 1.2 2002/11/11 05:21:35 jason Exp $ echo "On failure, please mail result to [EMAIL PROTECTED]\n"; -for ($x=0, $count=0; $x < 200; $x++) { +for ($x = 0, $count= 0; $x < 200; $x++) { $x2 = (int) exp(log($x)); // e ^ log(x) should be close in range to x if (($x2 < ($x + 2)) && ($x2 > ($x - 2))) { $count++; - } - else { + } else { print "$x : $x2\n"; } } print $count . "\n"; + +// Now test the base form of log +for ($base = 2; $base < 11; $base++) { + for ($x = 0, $count= 0; $x < 50; $x++) { + $x2 = (int) pow($base, log($x, $base)); + // base ^ log(x) should be close in range to x + if (($x2 < ($x + 2)) && ($x2 > ($x - 2))) { + $count++; + } else { + print "base $base: $x : $x2\n"; + } + } + print $count . "\n"; +} +?> --EXPECT-- On failure, please mail result to [EMAIL PROTECTED] 200 +50 +50 +50 +50 +50 +50 +50 +50 +50
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php