static VALUE nurat_equal_p(VALUE self, VALUE other) { switch (TYPE(other)) { case T_FIXNUM: case T_BIGNUM: { get_dat1(self); if (!FIXNUM_P(dat->den)) return Qfalse; if (FIX2LONG(dat->den) != 1) return Qfalse; if (f_equal_p(dat->num, other)) return Qtrue; else return Qfalse; } case T_FLOAT: return f_equal_p(f_to_f(self), other); case T_RATIONAL: { get_dat2(self, other); return f_boolcast(f_equal_p(adat->num, bdat->num) && f_equal_p(adat->den, bdat->den)); } default: return f_equal_p(other, self); } }
inline static VALUE f_imul(long x, long y) { VALUE r = f_imul_orig(x, y); assert(f_equal_p(r, f_mul(LONG2NUM(x), LONG2NUM(y)))); return r; }
static VALUE nucomp_equal_p(VALUE self, VALUE other) { if (k_complex_p(other)) { get_dat2(self, other); return f_boolcast(f_equal_p(adat->real, bdat->real) && f_equal_p(adat->imag, bdat->imag)); } if (k_numeric_p(other) && f_real_p(other)) { get_dat1(self); return f_boolcast(f_equal_p(dat->real, other) && f_zero_p(dat->imag)); } return f_equal_p(other, self); }
static VALUE nucomp_eql_p(VALUE self, VALUE other) { if (k_complex_p(other)) { get_dat2(self, other); return f_boolcast((CLASS_OF(adat->real) == CLASS_OF(bdat->real)) && (CLASS_OF(adat->imag) == CLASS_OF(bdat->imag)) && f_equal_p(self, other)); } return Qfalse; }
inline static VALUE nurat_s_canonicalize_internal_no_reduce(VALUE klass, VALUE num, VALUE den) { switch (FIX2INT(f_cmp(den, ZERO))) { case -1: num = f_negate(num); den = f_negate(den); break; case 0: rb_raise(rb_eZeroDivError, "devided by zero"); break; } if (f_equal_p(den, ONE) && f_unify_p(klass)) return num; else return nurat_s_new_internal(klass, num, den); }