summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog8
-rw-r--r--configure.in2
-rw-r--r--math.c15
-rw-r--r--missing/cbrt.c10
4 files changed, 34 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index 51502c9686..2d2375f762 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+Sat Feb 9 18:34:45 2008 Tanaka Akira <akr@fsij.org>
+
+ * math.c (math_cbrt): new method Math.cbrt.
+
+ * configure.in (cbrt): check for replacement functions.
+
+ * missing/cbrt.c: new file.
+
Sat Feb 9 17:51:24 2008 Nobuyoshi Nakada <nobu@ruby-lang.org>
* ext/bigdecimal/bigdecimal.c (BigDecimal_to_f): use strtod() for more
diff --git a/configure.in b/configure.in
index 28e85f39ec..0ede6e4d4b 100644
--- a/configure.in
+++ b/configure.in
@@ -649,7 +649,7 @@ esac
AC_FUNC_MEMCMP
AC_REPLACE_FUNCS(dup2 memmove strerror strftime\
strchr strstr crypt flock vsnprintf\
- isnan finite isinf hypot acosh erf tgamma lgamma_r \
+ isnan finite isinf hypot acosh erf tgamma lgamma_r cbrt \
strlcpy strlcat)
AC_CHECK_FUNCS(fmod killpg wait4 waitpid fork spawnv syscall chroot fsync getcwd eaccess\
truncate chsize times utimes utimensat fcntl lockf lstat\
diff --git a/math.c b/math.c
index fd10e97008..1f78d98a55 100644
--- a/math.c
+++ b/math.c
@@ -402,6 +402,20 @@ math_sqrt(VALUE obj, VALUE x)
/*
* call-seq:
+ * Math.cbrt(numeric) => float
+ *
+ * Returns the cube root of <i>numeric</i>.
+ */
+
+static VALUE
+math_cbrt(VALUE obj, VALUE x)
+{
+ Need_Float(x);
+ return DOUBLE2NUM(cbrt(RFLOAT_VALUE(x)));
+}
+
+/*
+ * call-seq:
* Math.frexp(numeric) => [ fraction, exponent ]
*
* Returns a two-element array containing the normalized fraction (a
@@ -611,6 +625,7 @@ Init_Math(void)
rb_define_module_function(rb_mMath, "log2", math_log2, 1);
rb_define_module_function(rb_mMath, "log10", math_log10, 1);
rb_define_module_function(rb_mMath, "sqrt", math_sqrt, 1);
+ rb_define_module_function(rb_mMath, "cbrt", math_cbrt, 1);
rb_define_module_function(rb_mMath, "frexp", math_frexp, 1);
rb_define_module_function(rb_mMath, "ldexp", math_ldexp, 2);
diff --git a/missing/cbrt.c b/missing/cbrt.c
new file mode 100644
index 0000000000..54db2703a0
--- /dev/null
+++ b/missing/cbrt.c
@@ -0,0 +1,10 @@
+#include <math.h>
+
+double cbrt(double x)
+{
+ if (x < 0)
+ return -pow(-x, 1/3.0);
+ else
+ return pow(x, 1/3.0);
+}
+