summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ext/standard/config.m42
-rw-r--r--ext/standard/math.c27
2 files changed, 21 insertions, 8 deletions
diff --git a/ext/standard/config.m4 b/ext/standard/config.m4
index 3d00d88dda..67952163aa 100644
--- a/ext/standard/config.m4
+++ b/ext/standard/config.m4
@@ -338,7 +338,7 @@ fi
dnl
dnl Check for available functions
dnl
-AC_CHECK_FUNCS(getcwd getwd asinh acosh atanh log1p hypot glob strfmon nice fpclass isinf isnan mempcpy strpncpy)
+AC_CHECK_FUNCS(getcwd getwd asinh acosh atanh log1p log2 hypot glob strfmon nice fpclass isinf isnan mempcpy strpncpy)
AC_FUNC_FNMATCH
dnl
diff --git a/ext/standard/math.c b/ext/standard/math.c
index 8a4b0459d5..0ced8a4ec6 100644
--- a/ext/standard/math.c
+++ b/ext/standard/math.c
@@ -661,22 +661,35 @@ PHP_FUNCTION(log1p)
PHP_FUNCTION(log)
{
double num, base = 0;
-
+
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "d|d", &num, &base) == FAILURE) {
return;
}
+
if (ZEND_NUM_ARGS() == 1) {
RETURN_DOUBLE(log(num));
}
- if (base <= 0.0) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "base must be greater than 0");
- RETURN_FALSE;
+
+#ifdef HAVE_LOG2
+ if (base == 2.0) {
+ RETURN_DOUBLE(log2(num));
+ }
+#endif
+
+ if (base == 10.0) {
+ RETURN_DOUBLE(log10(num));
}
- if (base == 1) {
+
+ if (base == 1.0) {
RETURN_DOUBLE(php_get_nan());
- } else {
- RETURN_DOUBLE(log(num) / log(base));
}
+
+ if (base <= 0.0) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "base must be greater than 0");
+ RETURN_FALSE;
+ }
+
+ RETURN_DOUBLE(log(num) / log(base));
}
/* }}} */