static VALUE nurat_s_new_bang(int argc, VALUE *argv, VALUE klass) { VALUE num, den; switch (rb_scan_args(argc, argv, "11", &num, &den)) { case 1: if (!k_integer_p(num)) num = f_to_i(num); den = ONE; break; default: if (!k_integer_p(num)) num = f_to_i(num); if (!k_integer_p(den)) den = f_to_i(den); switch (FIX2INT(f_cmp(den, ZERO))) { case -1: num = f_negate(num); den = f_negate(den); break; case 0: rb_raise_zerodiv(); break; } break; } return nurat_s_new_internal(klass, num, den); }
/*static*/ rational_type f_to_r(const floating_type& f) { integer_type n = f_to_i(f); floating_type m = f - i_to_f(n); if (m.is_zero()) return rational_type(n, integer_type(1)); integer_type k("620448401733239439360000"); // 24! m *= floating_type(k); integer_type j = f_to_i(m + 0.5); j += n * k + 1; return rational_type(j, k); }
static VALUE f_round_common(int argc, VALUE *argv, VALUE self, VALUE (*func)(VALUE, SEL)) { VALUE n, b, s; if (argc == 0) return (*func)(self, NULL); rb_scan_args(argc, argv, "01", &n); if (!k_integer_p(n)) rb_raise(rb_eTypeError, "not an integer"); b = f_expt(INT2FIX(10), n); s = f_mul(self, b); s = (*func)(s, NULL); s = f_div(f_rational_new_bang1(CLASS_OF(self), s), b); if (f_lt_p(n, ONE)) s = f_to_i(s); return s; }
integer_type Number::to_i() const { switch (type()) { case Number::INTEGER: return get_i(); case Number::FLOATING: return f_to_i(); case Number::RATIONAL: return r_to_i(); #ifndef PMP_DISABLE_VECTOR case Number::VECTOR: if (empty()) return 0; else return get_v()[0].to_i(); #endif default: assert(0); return 0; } }
inline static VALUE nurat_int_value(VALUE num) { nurat_int_check(num); if (!k_integer_p(num)) num = f_to_i(num); return num; }
/* * call-seq: * cmp.to_i -> integer * * Returns the value as an integer if possible (the imaginary part * should be exactly zero). * * Complex(1, 0).to_i #=> 1 * Complex(1, 0.0).to_i # RangeError * Complex(1, 2).to_i # RangeError */ static VALUE nucomp_to_i(VALUE self) { get_dat1(self); if (k_inexact_p(dat->imag) || f_nonzero_p(dat->imag)) { rb_raise(rb_eRangeError, "can't convert %"PRIsVALUE" into Integer", self); } return f_to_i(dat->real); }
static VALUE float_decode(VALUE self) { double f; int n; f = frexp(RFLOAT_VALUE(self), &n); f = ldexp(f, DBL_MANT_DIG); n -= DBL_MANT_DIG; return rb_assoc_new(f_to_i(rb_float_new(f)), INT2FIX(n)); }
static VALUE nucomp_s_new_bang(int argc, VALUE *argv, VALUE klass) { VALUE real, imag; switch (rb_scan_args(argc, argv, "11", &real, &imag)) { case 1: if (!k_numeric_p(real)) real = f_to_i(real); imag = ZERO; break; default: if (!k_numeric_p(real)) real = f_to_i(real); if (!k_numeric_p(imag)) imag = f_to_i(imag); break; } return nucomp_s_new_internal(klass, real, imag); }
/* * call-seq: * cmp.to_i -> integer * * Returns the value as an integer if possible. */ static VALUE nucomp_to_i(VALUE self) { get_dat1(self); if (k_inexact_p(dat->imag) || f_nonzero_p(dat->imag)) { VALUE s = f_to_s(self); rb_raise(rb_eRangeError, "can't convert %s into Integer", StringValuePtr(s)); } return f_to_i(dat->real); }
static VALUE string_to_c_internal(VALUE self) { VALUE s; s = self; if (RSTRING_LEN(s) == 0) return rb_assoc_new(Qnil, self); { VALUE m, sr, si, re, r, i; int po; m = f_match(comp_pat0, s); if (!NIL_P(m)) { sr = rb_reg_nth_match(1, m); si = rb_reg_nth_match(2, m); re = rb_reg_match_post(m); po = 1; } if (NIL_P(m)) { m = f_match(comp_pat1, s); if (!NIL_P(m)) { sr = Qnil; si = rb_reg_nth_match(1, m); if (NIL_P(si)) si = rb_usascii_str_new2(""); { VALUE t; t = rb_reg_nth_match(2, m); if (NIL_P(t)) t = rb_usascii_str_new2("1"); rb_str_concat(si, t); } re = rb_reg_match_post(m); po = 0; } } if (NIL_P(m)) { m = f_match(comp_pat2, s); if (NIL_P(m)) return rb_assoc_new(Qnil, self); sr = rb_reg_nth_match(1, m); if (NIL_P(rb_reg_nth_match(2, m))) si = Qnil; else { VALUE t; si = rb_reg_nth_match(3, m); t = rb_reg_nth_match(4, m); if (NIL_P(t)) t = rb_usascii_str_new2("1"); rb_str_concat(si, t); } re = rb_reg_match_post(m); po = 0; } r = INT2FIX(0); i = INT2FIX(0); if (!NIL_P(sr)) { if (strchr(RSTRING_PTR(sr), '/')) r = f_to_r(sr); else if (strpbrk(RSTRING_PTR(sr), ".eE")) r = f_to_f(sr); else r = f_to_i(sr); } if (!NIL_P(si)) { if (strchr(RSTRING_PTR(si), '/')) i = f_to_r(si); else if (strpbrk(RSTRING_PTR(si), ".eE")) i = f_to_f(si); else i = f_to_i(si); } if (po) return rb_assoc_new(rb_complex_polar(r, i), re); else return rb_assoc_new(rb_complex_new2(r, i), re); } }
static VALUE string_to_r_internal(VALUE self) { VALUE s, m; s = self; if (RSTRING_LEN(s) == 0) return rb_assoc_new(Qnil, self); m = f_match(rat_pat, s); if (!NIL_P(m)) { VALUE v, ifp, exp, ip, fp; VALUE si = f_aref(m, INT2FIX(1)); VALUE nu = f_aref(m, INT2FIX(2)); VALUE de = f_aref(m, INT2FIX(3)); VALUE re = f_post_match(m); { VALUE a; a = f_split(nu, an_e_pat); ifp = RARRAY_PTR(a)[0]; if (RARRAY_LEN(a) != 2) exp = Qnil; else exp = RARRAY_PTR(a)[1]; a = f_split(ifp, a_dot_pat); ip = RARRAY_PTR(a)[0]; if (RARRAY_LEN(a) != 2) fp = Qnil; else fp = RARRAY_PTR(a)[1]; } v = rb_rational_new1(f_to_i(ip)); if (!NIL_P(fp)) { char *p = StringValuePtr(fp); long count = 0; VALUE l; while (*p) { if (rb_isdigit(*p)) count++; p++; } l = f_expt(INT2FIX(10), LONG2NUM(count)); v = f_mul(v, l); v = f_add(v, f_to_i(fp)); v = f_div(v, l); } if (!NIL_P(si) && *StringValuePtr(si) == '-') v = f_negate(v); if (!NIL_P(exp)) v = f_mul(v, f_expt(INT2FIX(10), f_to_i(exp))); #if 0 if (!NIL_P(de) && (!NIL_P(fp) || !NIL_P(exp))) return rb_assoc_new(v, rb_usascii_str_new2("dummy")); #endif if (!NIL_P(de)) v = f_div(v, f_to_i(de)); return rb_assoc_new(v, re); } return rb_assoc_new(Qnil, self); }
static VALUE string_to_c_internal(VALUE self) { VALUE s; s = self; if (RSTRING_LEN(s) == 0) return rb_assoc_new(Qnil, self); { VALUE m, sr, si, re, r, i; int po; m = f_match(comp_pat0, s); if (!NIL_P(m)) { sr = f_aref(m, INT2FIX(1)); si = f_aref(m, INT2FIX(2)); re = f_post_match(m); po = 1; } if (NIL_P(m)) { m = f_match(comp_pat1, s); if (!NIL_P(m)) { sr = Qnil; si = f_aref(m, INT2FIX(1)); if (NIL_P(si)) si = rb_usascii_str_new2(""); { VALUE t; t = f_aref(m, INT2FIX(2)); if (NIL_P(t)) t = rb_usascii_str_new2("1"); rb_str_concat(si, t); } re = f_post_match(m); po = 0; } } if (NIL_P(m)) { m = f_match(comp_pat2, s); if (NIL_P(m)) return rb_assoc_new(Qnil, self); sr = f_aref(m, INT2FIX(1)); if (NIL_P(f_aref(m, INT2FIX(2)))) si = Qnil; else { VALUE t; si = f_aref(m, INT2FIX(3)); t = f_aref(m, INT2FIX(4)); if (NIL_P(t)) t = rb_usascii_str_new2("1"); rb_str_concat(si, t); } re = f_post_match(m); po = 0; } r = INT2FIX(0); i = INT2FIX(0); if (!NIL_P(sr)) { if (f_include_p(sr, a_slash)) r = f_to_r(sr); else if (f_gt_p(f_count(sr, a_dot_and_an_e), INT2FIX(0))) r = f_to_f(sr); else r = f_to_i(sr); } if (!NIL_P(si)) { if (f_include_p(si, a_slash)) i = f_to_r(si); else if (f_gt_p(f_count(si, a_dot_and_an_e), INT2FIX(0))) i = f_to_f(si); else i = f_to_i(si); } if (po) return rb_assoc_new(rb_complex_polar(r, i), re); else return rb_assoc_new(rb_complex_new2(r, i), re); } }