Feature #10800 » introduce_num2dbl_with_to_f_func.patch
math.c | ||
---|---|---|
VALUE rb_mMath;
|
||
VALUE rb_eMathDomainError;
|
||
#define fix_to_f_optimizable() rb_method_basic_definition_p(rb_cFixnum, id_to_f)
|
||
#define Get_Float(x) \
|
||
((RB_TYPE_P((x), T_FLOAT) ? (void)0 : ((x) = rb_to_float(x))), RFLOAT_VALUE(x))
|
||
#define Get_Double(x) \
|
||
(FIXNUM_P(x) && fix_to_f_optimizable() ? \
|
||
(double)FIX2LONG(x) : \
|
||
Get_Float(x))
|
||
static inline double
|
||
num2dbl_with_to_f(VALUE num)
|
||
{
|
||
switch (TYPE(num)) {
|
||
case T_FLOAT:
|
||
return RFLOAT_VALUE(num);
|
||
case T_FIXNUM:
|
||
if (rb_method_basic_definition_p(rb_cFixnum, id_to_f)) {
|
||
return (double)FIX2LONG(num);
|
||
}
|
||
else {
|
||
return RFLOAT_VALUE(rb_to_float(num));
|
||
}
|
||
case T_BIGNUM:
|
||
if (rb_method_basic_definition_p(rb_cBignum, id_to_f)) {
|
||
return rb_big2dbl(num);
|
||
}
|
||
else {
|
||
return RFLOAT_VALUE(rb_to_float(num));
|
||
}
|
||
default:
|
||
return RFLOAT_VALUE(rb_to_float(num));
|
||
}
|
||
}
|
||
#define domain_error(msg) \
|
||
rb_raise(rb_eMathDomainError, "Numerical argument is out of domain - " #msg)
|
||
... | ... | |
# define M_PI 3.14159265358979323846
|
||
#endif
|
||
double dx, dy;
|
||
dx = Get_Double(x);
|
||
dy = Get_Double(y);
|
||
dx = num2dbl_with_to_f(x);
|
||
dy = num2dbl_with_to_f(y);
|
||
if (dx == 0.0 && dy == 0.0) {
|
||
if (!signbit(dx))
|
||
return DBL2NUM(dy);
|
||
... | ... | |
static VALUE
|
||
math_cos(VALUE obj, VALUE x)
|
||
{
|
||
return DBL2NUM(cos(Get_Double(x)));
|
||
return DBL2NUM(cos(num2dbl_with_to_f(x)));
|
||
}
|
||
/*
|
||
... | ... | |
static VALUE
|
||
math_sin(VALUE obj, VALUE x)
|
||
{
|
||
return DBL2NUM(sin(Get_Double(x)));
|
||
return DBL2NUM(sin(num2dbl_with_to_f(x)));
|
||
}
|
||
... | ... | |
static VALUE
|
||
math_tan(VALUE obj, VALUE x)
|
||
{
|
||
return DBL2NUM(tan(Get_Double(x)));
|
||
return DBL2NUM(tan(num2dbl_with_to_f(x)));
|
||
}
|
||
/*
|
||
... | ... | |
{
|
||
double d0, d;
|
||
d0 = Get_Double(x);
|
||
d0 = num2dbl_with_to_f(x);
|
||
/* check for domain error */
|
||
if (d0 < -1.0 || 1.0 < d0) domain_error("acos");
|
||
d = acos(d0);
|
||
... | ... | |
{
|
||
double d0, d;
|
||
d0 = Get_Double(x);
|
||
d0 = num2dbl_with_to_f(x);
|
||
/* check for domain error */
|
||
if (d0 < -1.0 || 1.0 < d0) domain_error("asin");
|
||
d = asin(d0);
|
||
... | ... | |
static VALUE
|
||
math_atan(VALUE obj, VALUE x)
|
||
{
|
||
return DBL2NUM(atan(Get_Double(x)));
|
||
return DBL2NUM(atan(num2dbl_with_to_f(x)));
|
||
}
|
||
#ifndef HAVE_COSH
|
||
... | ... | |
static VALUE
|
||
math_cosh(VALUE obj, VALUE x)
|
||
{
|
||
return DBL2NUM(cosh(Get_Double(x)));
|
||
return DBL2NUM(cosh(num2dbl_with_to_f(x)));
|
||
}
|
||
#ifndef HAVE_SINH
|
||
... | ... | |
static VALUE
|
||
math_sinh(VALUE obj, VALUE x)
|
||
{
|
||
return DBL2NUM(sinh(Get_Double(x)));
|
||
return DBL2NUM(sinh(num2dbl_with_to_f(x)));
|
||
}
|
||
#ifndef HAVE_TANH
|
||
... | ... | |
static VALUE
|
||
math_tanh(VALUE obj, VALUE x)
|
||
{
|
||
return DBL2NUM(tanh(Get_Double(x)));
|
||
return DBL2NUM(tanh(num2dbl_with_to_f(x)));
|
||
}
|
||
/*
|
||
... | ... | |
{
|
||
double d0, d;
|
||
d0 = Get_Double(x);
|
||
d0 = num2dbl_with_to_f(x);
|
||
/* check for domain error */
|
||
if (d0 < 1.0) domain_error("acosh");
|
||
d = acosh(d0);
|
||
... | ... | |
static VALUE
|
||
math_asinh(VALUE obj, VALUE x)
|
||
{
|
||
return DBL2NUM(asinh(Get_Double(x)));
|
||
return DBL2NUM(asinh(num2dbl_with_to_f(x)));
|
||
}
|
||
/*
|
||
... | ... | |
{
|
||
double d0, d;
|
||
d0 = Get_Double(x);
|
||
d0 = num2dbl_with_to_f(x);
|
||
/* check for domain error */
|
||
if (d0 < -1.0 || +1.0 < d0) domain_error("atanh");
|
||
/* check for pole error */
|
||
... | ... | |
static VALUE
|
||
math_exp(VALUE obj, VALUE x)
|
||
{
|
||
return DBL2NUM(exp(Get_Double(x)));
|
||
return DBL2NUM(exp(num2dbl_with_to_f(x)));
|
||
}
|
||
#if defined __CYGWIN__
|
||
... | ... | |
numbits = 0;
|
||
}
|
||
d0 = Get_Double(x);
|
||
d0 = num2dbl_with_to_f(x);
|
||
/* check for domain error */
|
||
if (d0 < 0.0) domain_error("log");
|
||
/* check for pole error */
|
||
... | ... | |
numbits = 0;
|
||
}
|
||
d0 = Get_Double(x);
|
||
d0 = num2dbl_with_to_f(x);
|
||
/* check for domain error */
|
||
if (d0 < 0.0) domain_error("log2");
|
||
/* check for pole error */
|
||
... | ... | |
numbits = 0;
|
||
}
|
||
d0 = Get_Double(x);
|
||
d0 = num2dbl_with_to_f(x);
|
||
/* check for domain error */
|
||
if (d0 < 0.0) domain_error("log10");
|
||
/* check for pole error */
|
||
... | ... | |
{
|
||
double d0, d;
|
||
d0 = Get_Double(x);
|
||
d0 = num2dbl_with_to_f(x);
|
||
/* check for domain error */
|
||
if (d0 < 0.0) domain_error("sqrt");
|
||
if (d0 == 0.0) return DBL2NUM(0.0);
|
||
... | ... | |
static VALUE
|
||
math_cbrt(VALUE obj, VALUE x)
|
||
{
|
||
return DBL2NUM(cbrt(Get_Double(x)));
|
||
return DBL2NUM(cbrt(num2dbl_with_to_f(x)));
|
||
}
|
||
/*
|
||
... | ... | |
double d;
|
||
int exp;
|
||
d = frexp(Get_Double(x), &exp);
|
||
d = frexp(num2dbl_with_to_f(x), &exp);
|
||
return rb_assoc_new(DBL2NUM(d), INT2NUM(exp));
|
||
}
|
||
... | ... | |
static VALUE
|
||
math_ldexp(VALUE obj, VALUE x, VALUE n)
|
||
{
|
||
return DBL2NUM(ldexp(Get_Double(x), NUM2INT(n)));
|
||
return DBL2NUM(ldexp(num2dbl_with_to_f(x), NUM2INT(n)));
|
||
}
|
||
/*
|
||
... | ... | |
static VALUE
|
||
math_hypot(VALUE obj, VALUE x, VALUE y)
|
||
{
|
||
return DBL2NUM(hypot(Get_Double(x), Get_Double(y)));
|
||
return DBL2NUM(hypot(num2dbl_with_to_f(x), num2dbl_with_to_f(y)));
|
||
}
|
||
/*
|
||
... | ... | |
static VALUE
|
||
math_erf(VALUE obj, VALUE x)
|
||
{
|
||
return DBL2NUM(erf(Get_Double(x)));
|
||
return DBL2NUM(erf(num2dbl_with_to_f(x)));
|
||
}
|
||
/*
|
||
... | ... | |
static VALUE
|
||
math_erfc(VALUE obj, VALUE x)
|
||
{
|
||
return DBL2NUM(erfc(Get_Double(x)));
|
||
return DBL2NUM(erfc(num2dbl_with_to_f(x)));
|
||
}
|
||
/*
|
||
... | ... | |
};
|
||
double d0, d;
|
||
double intpart, fracpart;
|
||
d0 = Get_Double(x);
|
||
d0 = num2dbl_with_to_f(x);
|
||
/* check for domain error */
|
||
if (isinf(d0) && signbit(d0)) domain_error("gamma");
|
||
fracpart = modf(d0, &intpart);
|
||
... | ... | |
double d0, d;
|
||
int sign=1;
|
||
VALUE v;
|
||
d0 = Get_Double(x);
|
||
d0 = num2dbl_with_to_f(x);
|
||
/* check for domain error */
|
||
if (isinf(d0)) {
|
||
if (signbit(d0)) domain_error("lgamma");
|
||
-
|