20 #if defined(HAVE_LIBGMP) && defined(HAVE_GMP_H)
25 #define ZERO INT2FIX(0)
26 #define ONE INT2FIX(1)
27 #define TWO INT2FIX(2)
29 #define GMP_GCD_DIGITS 1
37 #define f_boolcast(x) ((x) ? Qtrue : Qfalse)
38 #define f_inspect rb_inspect
39 #define f_to_s rb_obj_as_string
43 f_##n(VALUE x, VALUE y)\
45 return rb_funcall(x, (op), 1, y);\
52 return rb_funcall(x, id_##n, 0);\
57 f_##n(VALUE x, VALUE y)\
59 return rb_funcall(x, id_##n, 1, y);\
167 #define f_expt10(x) f_expt(INT2FIX(10), x)
177 #define f_positive_p(x) (!f_negative_p(x))
196 #define f_nonzero_p(x) (!f_zero_p(x))
266 #define k_exact_p(x) (!k_float_p(x))
267 #define k_inexact_p(x) k_float_p(x)
269 #define k_exact_zero_p(x) (k_exact_p(x) && f_zero_p(x))
270 #define k_exact_one_p(x) (k_exact_p(x) && f_one_p(x))
299 #define f_gcd f_gcd_orig
369 return rb_gcd_gmp(x, y);
381 VALUE r = f_gcd_orig(x, y);
398 #define get_dat1(x) \
399 struct RRational *dat;\
400 dat = ((struct RRational *)(x))
402 #define get_dat2(x,y) \
403 struct RRational *adat, *bdat;\
404 adat = ((struct RRational *)(x));\
405 bdat = ((struct RRational *)(y))
424 #define rb_raise_zerodiv() rb_raise(rb_eZeroDivError, "divided by 0")
466 #ifdef CANONICALIZATION_FOR_MATHN
471 static int canonicalization = 0;
476 canonicalization = f;
513 gcd =
f_gcd(num, den);
518 if (
f_one_p(den) && canonicalization)
538 if (
f_one_p(den) && canonicalization)
648 #define f_imul f_imul_orig
656 if (a == 0 || b == 0)
676 VALUE r = f_imul_orig(x, y);
693 long ig =
i_gcd(ad, bd);
763 adat->num, adat->den,
764 bdat->num, bdat->den,
'+');
804 adat->num, adat->den,
805 bdat->num, bdat->den,
'-');
836 long g1 =
i_gcd(an, bd);
837 long g2 =
i_gcd(ad, bn);
839 num =
f_imul(an / g1, bn / g2);
840 den =
f_imul(ad / g2, bd / g1);
884 adat->num, adat->den,
885 bdat->num, bdat->den,
'*');
930 bdat->den, bdat->num);
933 adat->num, adat->den,
934 bdat->num, bdat->den,
'/');
1025 num =
f_expt(dat->num, other);
1026 den =
f_expt(dat->den, other);
1041 rb_warn(
"in a**b, b may be too big");
1074 return f_cmp(dat->num, other);
1093 num1 =
f_mul(adat->num, bdat->den);
1094 num2 =
f_mul(bdat->num, adat->den);
1185 return f_idiv(
self, other);
1207 nurat_true(
VALUE self)
1217 return f_idiv(dat->num, dat->den);
1248 return f_idiv(dat->num, dat->den);
1281 return (*
func)(
self);
1423 return f_fdiv(dat->num, dat->den);
1441 #define id_ceil rb_intern("ceil")
1442 #define f_ceil(x) rb_funcall((x), id_ceil, 0)
1444 #define id_quo rb_intern("quo")
1445 #define f_quo(x,y) rb_funcall((x), id_quo, 1, (y))
1447 #define f_reciprocal(x) f_quo(ONE, (x))
1511 VALUE c, k, t, p0, p1, p2, q0, q1, q2;
1554 VALUE e, a, b, p, q;
1596 s = (*func)(dat->num);
1715 return f_gcd(
self, other);
1733 return f_lcm(
self, other);
1776 #define id_numerator rb_intern("numerator")
1777 #define f_numerator(x) rb_funcall((x), id_numerator, 0)
1779 #define id_denominator rb_intern("denominator")
1780 #define f_denominator(x) rb_funcall((x), id_denominator, 0)
1782 #define id_to_r rb_intern("to_r")
1783 #define f_to_r(x) rb_funcall((x), id_to_r, 0)
1822 return f_fdiv(x, y);
1826 if (canonicalization) {
1969 float_decode(
VALUE self)
1978 #define id_lshift rb_intern("<<")
1979 #define f_lshift(x,n) rb_funcall((x), id_lshift, 1, (n))
2022 VALUE e, a, b, p, q;
2046 VALUE two_times_f, den;
2056 VALUE radix_times_f, den;
2110 return (c ==
'-' || c ==
'+');
2128 return isdigit((
unsigned char)c);
2136 int us = 1, ret = 1;
2167 }
while (**s ==
'_');
2178 return (c ==
'e' || c ==
'E');
2204 *num =
f_mul(*num, l);
2205 *num =
f_add(*num, fp);
2206 *num =
f_div(*num, l);
2225 *num =
f_mul(*num, l);
2245 if (!
read_num(s, sign, strict, num))
2252 *num =
f_div(*num, den);
2272 while (isspace((
unsigned char)**s))
2388 VALUE a1, a2, backref;
2435 (!f_integer_p(a1) || !f_integer_p(a2)))
2436 return f_div(a1, a2);
2492 #define rb_intern(str) rb_intern_const(str)
2494 assert(fprintf(stderr,
"assert() is now active\n"));