static VALUE rb_gsl_rational_div(VALUE obj, VALUE other) { gsl_rational *r = NULL, *r2 = NULL, *rnew = NULL; gsl_poly *p; size_t i; Data_Get_Struct(obj, gsl_rational, r); if (RATIONAL_P(other)) { Data_Get_Struct(other, gsl_rational, r2); rnew = gsl_rational_div(r, r2); } else if (VECTOR_P(other)) { Data_Get_Struct(other, gsl_vector, p); rnew = gsl_rational_div_poly(r, p); } else { switch (TYPE(other)) { case T_ARRAY: p = gsl_vector_alloc(RARRAY_LEN(other)); for (i = 0; i < p->size; i++) gsl_vector_set(p, i, NUM2DBL(rb_ary_entry(other, i))); rnew = gsl_rational_div_poly(r, p); gsl_vector_free(p); break; case T_FLOAT: case T_FIXNUM: rnew = gsl_rational_new(r->pnum, r->pden); gsl_vector_scale(rnew->pnum, 1.0/NUM2DBL(other)); break; default: rb_raise(rb_eTypeError, "wrong argument type %s", rb_class2name(CLASS_OF(other))); break; } } return Data_Wrap_Struct(cgsl_rational, gsl_rational_mark, gsl_rational_free, rnew); }
int basic_raw_float_conv_p( obj a ) { if (LONG_INT_P( a )) { return 1; } #if FULL_NUMERIC_TOWER if (RATIONAL_P( a )) { return 1; } #endif if (LONGFLOAT_P( a )) { return 1; } return 0; }
static VALUE rb_gsl_rational_add(VALUE obj, VALUE other) { gsl_rational *r = NULL, *r2 = NULL, *rnew = NULL; gsl_poly *p = NULL; int flag = 0; Data_Get_Struct(obj, gsl_rational, r); if (RATIONAL_P(other)) { Data_Get_Struct(other, gsl_rational, r2); rnew = gsl_rational_add(r, r2); } else { p = get_poly_get(other, &flag); rnew = gsl_rational_add_poly(r, p); if (flag == 1) gsl_vector_free(p); } return Data_Wrap_Struct(cgsl_rational, gsl_rational_mark, gsl_rational_free, rnew); }
double basic_raw_float_conv( obj a ) { if (LONG_INT_P( a )) { return int_64_to_float( extract_int_64( a ) ); } #if FULL_NUMERIC_TOWER if (RATIONAL_P( a )) { return rational_to_raw_float( a ); } #endif if (LONGFLOAT_P( a )) { return extract_float( a ); } scheme_error( "cannot convert ~s to an inexact real", 1, a ); return 0; }
static VALUE rb_gsl_rational_uminus(VALUE obj) { gsl_rational *r = NULL, *rnew; gsl_poly *p = NULL, *ptmp; int flag = 0; size_t i; if (RATIONAL_P(obj)) { Data_Get_Struct(obj, gsl_rational, r); rnew = gsl_rational_new(r->pnum, r->pden); for (i = 0; i < rnew->pnum->size; i++) gsl_vector_set(rnew->pnum, i, -gsl_vector_get(r->pnum, i)); return Data_Wrap_Struct(cgsl_rational, gsl_rational_mark, gsl_rational_free, rnew); } else { if (POLY_P(obj)) { Data_Get_Struct(obj, gsl_vector, ptmp); p = make_vector_clone(ptmp); } else { p = get_poly_get(obj, &flag); } for (i = 0; i < p->size; i++) gsl_vector_set(p, i, -gsl_vector_get(p, i)); return Data_Wrap_Struct(cgsl_poly, 0, gsl_vector_free, p); } }