summaryrefslogtreecommitdiff
path: root/math.c
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2016-07-12 13:07:51 (GMT)
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2016-07-12 13:07:51 (GMT)
commit92b98a982bd4cf15393c53236e55c95eecb4adfa (patch)
tree220be8196c01baecb0cf2de4b0626fdf8614b70c /math.c
parent7c0cb4351a4ec726a7c8fad94c61d1781125ca86 (diff)
math.c: get_double_rshift
* math.c (get_double_rshift): extract bignum to double conversion with bit offset. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@55644 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'math.c')
-rw-r--r--math.c37
1 files changed, 12 insertions, 25 deletions
diff --git a/math.c b/math.c
index a66c9bf..750a520 100644
--- a/math.c
+++ b/math.c
@@ -456,9 +456,8 @@ math_log(int argc, const VALUE *argv, VALUE obj)
}
static double
-math_log1(VALUE x)
+get_double_rshift(VALUE x, size_t *pnumbits)
{
- double d;
size_t numbits;
if (RB_BIGNUM_TYPE_P(x) && BIGNUM_POSITIVE_P(x) &&
@@ -469,8 +468,16 @@ math_log1(VALUE x)
else {
numbits = 0;
}
+ *pnumbits = numbits;
+ return Get_Double(x);
+}
+
+static double
+math_log1(VALUE x)
+{
+ size_t numbits;
+ double d = get_double_rshift(x, &numbits);
- d = Get_Double(x);
/* check for domain error */
if (d < 0.0) domain_error("log");
/* check for pole error */
@@ -511,19 +518,9 @@ extern double log2(double);
static VALUE
math_log2(VALUE obj, VALUE x)
{
- double d;
size_t numbits;
+ double d = get_double_rshift(x, &numbits);
- if (RB_BIGNUM_TYPE_P(x) && BIGNUM_POSITIVE_P(x) &&
- DBL_MAX_EXP <= (numbits = rb_absint_numwords(x, 1, NULL))) {
- numbits -= DBL_MANT_DIG;
- x = rb_big_rshift(x, SIZET2NUM(numbits));
- }
- else {
- numbits = 0;
- }
-
- d = Get_Double(x);
/* check for domain error */
if (d < 0.0) domain_error("log2");
/* check for pole error */
@@ -551,19 +548,9 @@ math_log2(VALUE obj, VALUE x)
static VALUE
math_log10(VALUE obj, VALUE x)
{
- double d;
size_t numbits;
+ double d = get_double_rshift(x, &numbits);
- if (RB_BIGNUM_TYPE_P(x) && BIGNUM_POSITIVE_P(x) &&
- DBL_MAX_EXP <= (numbits = rb_absint_numwords(x, 1, NULL))) {
- numbits -= DBL_MANT_DIG;
- x = rb_big_rshift(x, SIZET2NUM(numbits));
- }
- else {
- numbits = 0;
- }
-
- d = Get_Double(x);
/* check for domain error */
if (d < 0.0) domain_error("log10");
/* check for pole error */