15 #define ZERO INT2FIX(0)
16 #define ONE INT2FIX(1)
17 #define TWO INT2FIX(2)
27 #define f_boolcast(x) ((x) ? Qtrue : Qfalse)
31 f_##n(VALUE x, VALUE y)\
33 return rb_funcall(x, (op), 1, y);\
40 return rb_funcall(x, id_##n, 0);\
45 f_##n(VALUE x, VALUE y)\
47 return rb_funcall(x, id_##n, 1, y);\
54 return rb_funcall(rb_mMath, id_##n, 1, x);\
59 m_##n(VALUE x, VALUE y)\
61 return rb_funcall(rb_mMath, id_##n, 2, x, y);\
64 #define PRESERVE_SIGNEDZERO
69 #ifndef PRESERVE_SIGNEDZERO
97 #ifndef PRESERVE_SIGNEDZERO
123 #ifndef PRESERVE_SIGNEDZERO
176 #define f_positive_p(x) (!f_negative_p(x))
195 #define f_nonzero_p(x) (!f_zero_p(x))
258 #define k_exact_p(x) (!k_float_p(x))
259 #define k_inexact_p(x) k_float_p(x)
261 #define k_exact_zero_p(x) (k_exact_p(x) && f_zero_p(x))
262 #define k_exact_one_p(x) (k_exact_p(x) && f_one_p(x))
264 #define get_dat1(x) \
265 struct RComplex *dat;\
266 dat = ((struct RComplex *)(x))
268 #define get_dat2(x,y) \
269 struct RComplex *adat, *bdat;\
270 adat = ((struct RComplex *)(x));\
271 bdat = ((struct RComplex *)(y))
329 #ifdef CANONICALIZATION_FOR_MATHN
334 static int canonicalization = 0;
339 canonicalization = f;
364 if (
f_zero_p(imag) && canonicalization)
368 if (f_real_p(real) && f_real_p(imag))
370 else if (f_real_p(real)) {
374 f_sub(real, dat->imag),
377 else if (f_real_p(imag)) {
382 f_add(dat->imag, imag));
388 f_sub(adat->real, bdat->imag),
389 f_add(adat->imag, bdat->real));
466 inline static VALUE \
467 m_##n##_bang(VALUE x)\
469 return rb_math_##n(x);\
473 inline static VALUE \
474 m_##n##_bang(VALUE x, VALUE y)\
476 return rb_math_##n(x, y);\
485 #define m_hypot(x,y) m_hypot_bang((x),(y))
500 return m_cos_bang(x);
504 f_mul(m_cos_bang(dat->real),
505 m_cosh_bang(dat->imag)),
507 m_sinh_bang(dat->imag)));
515 return m_sin_bang(x);
519 f_mul(m_sin_bang(dat->real),
520 m_cosh_bang(dat->imag)),
521 f_mul(m_cos_bang(dat->real),
522 m_sinh_bang(dat->imag)));
534 return m_sqrt_bang(x);
541 return f_conj(m_sqrt(f_conj(x)));
649 real = (*func)(adat->real, bdat->real);
650 imag = (*func)(adat->imag, bdat->imag);
658 (*
func)(dat->real, other), dat->imag);
720 f_mul(adat->imag, bdat->imag));
722 f_mul(adat->imag, bdat->real));
730 f_mul(dat->real, other),
731 f_mul(dat->imag, other));
750 r = (*func)(bdat->imag, bdat->real);
758 f_mul(adat->imag, r)), n),
760 f_mul(adat->real, r)), n));
765 r = (*func)(bdat->real, bdat->imag);
782 (*
func)(dat->real, other),
783 (*
func)(dat->imag, other));
788 #define rb_raise_zerodiv() rb_raise(rb_eZeroDivError, "divided by 0")
809 #define nucomp_quo nucomp_div
857 VALUE r, theta, nr, ntheta;
864 nr = m_exp_bang(
f_sub(
f_mul(dat->real, m_log_bang(r)),
865 f_mul(dat->imag, theta)));
867 f_mul(dat->imag, m_log_bang(r)));
893 f_mul(dat->imag, dat->imag)),
908 rb_warn(
"in a**b, b may be too big");
914 f_mul(theta, other));
989 return m_hypot(dat->real, dat->imag);
1006 f_mul(dat->imag, dat->imag));
1023 return m_atan2_bang(dat->imag, dat->real);
1075 nucomp_true(
VALUE self)
1096 nucomp_exact_p(
VALUE self)
1104 nucomp_inexact_p(
VALUE self)
1192 #if defined(HAVE_SIGNBIT) && defined(__GNUC__) && defined(__sun) && \
1218 s = (*func)(dat->real);
1366 return f_to_i(dat->real);
1390 return f_to_f(dat->real);
1416 return f_to_r(dat->real);
1491 return (c ==
'-' || c ==
'+');
1511 return isdigit((
unsigned char)c);
1541 }
while (**s ==
'_');
1548 return (c ==
'e' || c ==
'E');
1623 return (c ==
'i' || c ==
'I' ||
1624 c ==
'j' || c ==
'J');
1634 if (strpbrk(s,
".eE"))
1641 VALUE *ret,
char **b)
1653 num =
INT2FIX((sign ==
'-') ? -1 : + 1);
1697 num2 =
INT2FIX((sign ==
'-') ? -1 : + 1);
1724 while (isspace((
unsigned char)**s))
1836 VALUE a1, a2, backref;
1888 (!f_real_p(a1) || !f_real_p(a2)))
1938 return f_mul(
self,
self);
1941 #define id_PI rb_intern("PI")
2052 #define rb_intern(str) rb_intern_const(str)
2054 assert(fprintf(stderr,
"assert() is now active\n"));