/* * A rational number can be represented as a paired integer number; * a/b (b>0). Where a is numerator and b is denominator. Integer a * equals rational a/1 mathematically. * * In ruby, you can create rational object with Rational or to_r * method. The return values will be irreducible. * * Rational(1) #=> (1/1) * Rational(2, 3) #=> (2/3) * Rational(4, -6) #=> (-2/3) * 3.to_r #=> (3/1) * * You can also create ratioanl object from floating-point numbers or * strings. * * Rational(0.3) #=> (5404319552844595/18014398509481984) * Rational('0.3') #=> (3/10) * Rational('2/3') #=> (2/3) * * 0.3.to_r #=> (5404319552844595/18014398509481984) * '0.3'.to_r #=> (3/10) * '2/3'.to_r #=> (2/3) * * A rational object is an exact number, which helps you to write * program without any rounding errors. * * 10.times.inject(0){|t,| t + 0.1} #=> 0.9999999999999999 * 10.times.inject(0){|t,| t + Rational('0.1')} #=> (1/1) * * However, when an expression has inexact factor (numerical value or * operation), will produce an inexact result. * * Rational(10) / 3 #=> (10/3) * Rational(10) / 3.0 #=> 3.3333333333333335 * * Rational(-8) ** Rational(1, 3) * #=> (1.0000000000000002+1.7320508075688772i) */ void Init_Rational(void) { assert(fprintf(stderr, "assert() is now active\n")); id_abs = rb_intern("abs"); id_cmp = rb_intern("<=>"); id_convert = rb_intern("convert"); id_eqeq_p = rb_intern("=="); id_expt = rb_intern("**"); id_fdiv = rb_intern("fdiv"); id_floor = rb_intern("floor"); id_idiv = rb_intern("div"); id_inspect = rb_intern("inspect"); id_integer_p = rb_intern("integer?"); id_negate = rb_intern("-@"); id_to_f = rb_intern("to_f"); id_to_i = rb_intern("to_i"); id_to_s = rb_intern("to_s"); id_truncate = rb_intern("truncate"); rb_cRational = rb_define_class("Rational", rb_cNumeric); rb_objc_define_method(rb_cRational, "alloc", nurat_s_alloc, 0); rb_undef_method(CLASS_OF(rb_cRational), "allocate"); #if 0 rb_define_private_method(CLASS_OF(rb_cRational), "new!", nurat_s_new_bang, -1); rb_define_private_method(CLASS_OF(rb_cRational), "new", nurat_s_new, -1); #else rb_undef_method(CLASS_OF(rb_cRational), "new"); #endif rb_objc_define_method(rb_mKernel, "Rational", nurat_f_rational, -1); rb_objc_define_method(rb_cRational, "numerator", nurat_numerator, 0); rb_objc_define_method(rb_cRational, "denominator", nurat_denominator, 0); rb_objc_define_method(rb_cRational, "+", nurat_add, 1); rb_objc_define_method(rb_cRational, "-", nurat_sub, 1); rb_objc_define_method(rb_cRational, "*", nurat_mul, 1); rb_objc_define_method(rb_cRational, "/", nurat_div, 1); rb_objc_define_method(rb_cRational, "quo", nurat_div, 1); rb_objc_define_method(rb_cRational, "fdiv", nurat_fdiv, 1); rb_objc_define_method(rb_cRational, "**", nurat_expt, 1); rb_objc_define_method(rb_cRational, "<=>", nurat_cmp, 1); rb_objc_define_method(rb_cRational, "==", nurat_eqeq_p, 1); rb_objc_define_method(rb_cRational, "coerce", nurat_coerce, 1); #if 0 /* NUBY */ rb_define_method(rb_cRational, "//", nurat_idiv, 1); #endif #if 0 rb_define_method(rb_cRational, "quot", nurat_quot, 1); rb_define_method(rb_cRational, "quotrem", nurat_quotrem, 1); #endif #if 0 rb_define_method(rb_cRational, "rational?", nurat_true, 0); rb_define_method(rb_cRational, "exact?", nurat_true, 0); #endif rb_objc_define_method(rb_cRational, "floor", nurat_floor_n, -1); rb_objc_define_method(rb_cRational, "ceil", nurat_ceil_n, -1); rb_objc_define_method(rb_cRational, "truncate", nurat_truncate_n, -1); rb_objc_define_method(rb_cRational, "round", nurat_round_n, -1); rb_objc_define_method(rb_cRational, "to_i", nurat_truncate, 0); rb_objc_define_method(rb_cRational, "to_f", nurat_to_f, 0); rb_objc_define_method(rb_cRational, "to_r", nurat_to_r, 0); rb_objc_define_method(rb_cRational, "hash", nurat_hash, 0); rb_objc_define_method(rb_cRational, "to_s", nurat_to_s, 0); rb_objc_define_method(rb_cRational, "inspect", nurat_inspect, 0); rb_objc_define_method(rb_cRational, "marshal_dump", nurat_marshal_dump, 0); rb_objc_define_method(rb_cRational, "marshal_load", nurat_marshal_load, 1); /* --- */ rb_objc_define_method(rb_cInteger, "gcd", rb_gcd, 1); rb_objc_define_method(rb_cInteger, "lcm", rb_lcm, 1); rb_objc_define_method(rb_cInteger, "gcdlcm", rb_gcdlcm, 1); rb_objc_define_method(rb_cNumeric, "numerator", numeric_numerator, 0); rb_objc_define_method(rb_cNumeric, "denominator", numeric_denominator, 0); rb_objc_define_method(rb_cInteger, "numerator", integer_numerator, 0); rb_objc_define_method(rb_cInteger, "denominator", integer_denominator, 0); rb_objc_define_method(rb_cFloat, "numerator", float_numerator, 0); rb_objc_define_method(rb_cFloat, "denominator", float_denominator, 0); rb_objc_define_method(rb_cNilClass, "to_r", nilclass_to_r, 0); rb_objc_define_method(rb_cInteger, "to_r", integer_to_r, 0); rb_objc_define_method(rb_cFloat, "to_r", float_to_r, 0); make_patterns(); rb_objc_define_method(rb_cString, "to_r", string_to_r, 0); rb_objc_define_method(*(VALUE *)rb_cRational, "convert", nurat_s_convert, -1); // rb_define_private_method(CLASS_OF(rb_cRational), "convert", nurat_s_convert, -1); // TODO: insert NSNumber primitives }
void Init_Rational(void) { #undef rb_intern #define rb_intern(str) rb_intern_const(str) assert(fprintf(stderr, "assert() is now active\n")); id_abs = rb_intern("abs"); id_cmp = rb_intern("<=>"); id_convert = rb_intern("convert"); id_equal_p = rb_intern("=="); id_expt = rb_intern("**"); id_floor = rb_intern("floor"); id_hash = rb_intern("hash"); id_idiv = rb_intern("div"); id_inspect = rb_intern("inspect"); id_integer_p = rb_intern("integer?"); id_negate = rb_intern("-@"); id_to_f = rb_intern("to_f"); id_to_i = rb_intern("to_i"); id_to_s = rb_intern("to_s"); id_truncate = rb_intern("truncate"); ml = (long)(log(DBL_MAX) / log(2.0) - 1); rb_cRational = rb_define_class(RATIONAL_NAME, rb_cNumeric); rb_define_alloc_func(rb_cRational, nurat_s_alloc); rb_undef_method(CLASS_OF(rb_cRational), "allocate"); #if 0 rb_define_private_method(CLASS_OF(rb_cRational), "new!", nurat_s_new_bang, -1); rb_define_private_method(CLASS_OF(rb_cRational), "new", nurat_s_new, -1); #else rb_undef_method(CLASS_OF(rb_cRational), "new"); #endif rb_define_global_function(RATIONAL_NAME, nurat_f_rational, -1); rb_define_method(rb_cRational, "numerator", nurat_numerator, 0); rb_define_method(rb_cRational, "denominator", nurat_denominator, 0); rb_define_method(rb_cRational, "+", nurat_add, 1); rb_define_method(rb_cRational, "-", nurat_sub, 1); rb_define_method(rb_cRational, "*", nurat_mul, 1); rb_define_method(rb_cRational, "/", nurat_div, 1); rb_define_method(rb_cRational, "quo", nurat_div, 1); rb_define_method(rb_cRational, "fdiv", nurat_fdiv, 1); rb_define_method(rb_cRational, "**", nurat_expt, 1); rb_define_method(rb_cRational, "<=>", nurat_cmp, 1); rb_define_method(rb_cRational, "==", nurat_equal_p, 1); rb_define_method(rb_cRational, "coerce", nurat_coerce, 1); rb_define_method(rb_cRational, "div", nurat_idiv, 1); #if 0 /* NUBY */ rb_define_method(rb_cRational, "//", nurat_idiv, 1); #endif rb_define_method(rb_cRational, "modulo", nurat_mod, 1); rb_define_method(rb_cRational, "%", nurat_mod, 1); rb_define_method(rb_cRational, "divmod", nurat_divmod, 1); #if 0 rb_define_method(rb_cRational, "quot", nurat_quot, 1); #endif rb_define_method(rb_cRational, "remainder", nurat_rem, 1); #if 0 rb_define_method(rb_cRational, "quotrem", nurat_quotrem, 1); #endif rb_define_method(rb_cRational, "abs", nurat_abs, 0); #if 0 rb_define_method(rb_cRational, "rational?", nurat_true, 0); rb_define_method(rb_cRational, "exact?", nurat_true, 0); #endif rb_define_method(rb_cRational, "floor", nurat_floor, 0); rb_define_method(rb_cRational, "ceil", nurat_ceil, 0); rb_define_method(rb_cRational, "truncate", nurat_truncate, 0); rb_define_method(rb_cRational, "round", nurat_round, 0); rb_define_method(rb_cRational, "to_i", nurat_truncate, 0); rb_define_method(rb_cRational, "to_f", nurat_to_f, 0); rb_define_method(rb_cRational, "to_r", nurat_to_r, 0); rb_define_method(rb_cRational, "hash", nurat_hash, 0); rb_define_method(rb_cRational, "to_s", nurat_to_s, 0); rb_define_method(rb_cRational, "inspect", nurat_inspect, 0); rb_define_method(rb_cRational, "marshal_dump", nurat_marshal_dump, 0); rb_define_method(rb_cRational, "marshal_load", nurat_marshal_load, 1); /* --- */ rb_define_method(rb_cInteger, "gcd", rb_gcd, 1); rb_define_method(rb_cInteger, "lcm", rb_lcm, 1); rb_define_method(rb_cInteger, "gcdlcm", rb_gcdlcm, 1); rb_define_method(rb_cNilClass, "to_r", nilclass_to_r, 0); rb_define_method(rb_cInteger, "to_r", integer_to_r, 0); rb_define_method(rb_cFloat, "to_r", float_to_r, 0); make_patterns(); rb_define_method(rb_cString, "to_r", string_to_r, 0); rb_define_private_method(CLASS_OF(rb_cRational), "convert", nurat_s_convert, -1); }
void Init_Rational(void) { assert(fprintf(stderr, "assert() is now active\n")); id_Unify = rb_intern("Unify"); id_abs = rb_intern("abs"); id_cmp = rb_intern("<=>"); id_convert = rb_intern("convert"); id_equal_p = rb_intern("=="); id_expt = rb_intern("**"); id_floor = rb_intern("floor"); id_format = rb_intern("format"); id_idiv = rb_intern("div"); id_inspect = rb_intern("inspect"); id_negate = rb_intern("-@"); id_new = rb_intern("new"); id_new_bang = rb_intern("new!"); id_to_f = rb_intern("to_f"); id_to_i = rb_intern("to_i"); id_to_s = rb_intern("to_s"); id_truncate = rb_intern("truncate"); rb_cRational = rb_define_class(RATIONAL_NAME, rb_cNumeric); rb_define_alloc_func(rb_cRational, nurat_s_alloc); rb_funcall(rb_cRational, rb_intern("private_class_method"), 1, ID2SYM(rb_intern("allocate"))); rb_define_singleton_method(rb_cRational, "new!", nurat_s_new_bang, -1); rb_funcall(rb_cRational, rb_intern("private_class_method"), 1, ID2SYM(rb_intern("new!"))); rb_define_singleton_method(rb_cRational, "new", nurat_s_new_m, -1); rb_funcall(rb_cRational, rb_intern("private_class_method"), 1, ID2SYM(rb_intern("new"))); rb_define_global_function(RATIONAL_NAME, nurat_f_rational, -1); rb_define_method(rb_cRational, "numerator", nurat_numerator, 0); rb_define_method(rb_cRational, "denominator", nurat_denominator, 0); rb_define_method(rb_cRational, "+", nurat_add, 1); rb_define_method(rb_cRational, "-", nurat_sub, 1); rb_define_method(rb_cRational, "*", nurat_mul, 1); rb_define_method(rb_cRational, "/", nurat_div, 1); rb_define_method(rb_cRational, "quo", nurat_div, 1); rb_define_method(rb_cRational, "fdiv", nurat_fdiv, 1); rb_define_method(rb_cRational, "**", nurat_expt, 1); rb_define_method(rb_cRational, "<=>", nurat_cmp, 1); rb_define_method(rb_cRational, "==", nurat_equal_p, 1); rb_define_method(rb_cRational, "coerce", nurat_coerce, 1); rb_define_method(rb_cRational, "div", nurat_idiv, 1); #if NUBY rb_define_method(rb_cRational, "//", nurat_idiv, 1); #endif rb_define_method(rb_cRational, "modulo", nurat_mod, 1); rb_define_method(rb_cRational, "%", nurat_mod, 1); rb_define_method(rb_cRational, "divmod", nurat_divmod, 1); #if 0 rb_define_method(rb_cRational, "quot", nurat_quot, 1); #endif rb_define_method(rb_cRational, "remainder", nurat_rem, 1); #if 0 rb_define_method(rb_cRational, "quotrem", nurat_quotrem, 1); #endif rb_define_method(rb_cRational, "abs", nurat_abs, 0); #if 0 rb_define_method(rb_cRational, "rational?", nurat_true, 0); rb_define_method(rb_cRational, "exact?", nurat_true, 0); #endif rb_define_method(rb_cRational, "floor", nurat_floor, 0); rb_define_method(rb_cRational, "ceil", nurat_ceil, 0); rb_define_method(rb_cRational, "truncate", nurat_truncate, 0); rb_define_method(rb_cRational, "round", nurat_round, 0); rb_define_method(rb_cRational, "to_i", nurat_truncate, 0); rb_define_method(rb_cRational, "to_f", nurat_to_f, 0); rb_define_method(rb_cRational, "to_r", nurat_to_r, 0); rb_define_method(rb_cRational, "hash", nurat_hash, 0); rb_define_method(rb_cRational, "to_s", nurat_to_s, 0); rb_define_method(rb_cRational, "inspect", nurat_inspect, 0); rb_define_method(rb_cRational, "marshal_dump", nurat_marshal_dump, 0); rb_define_method(rb_cRational, "marshal_load", nurat_marshal_load, 1); /* --- */ rb_define_method(rb_cInteger, "gcd", rb_gcd, 1); rb_define_method(rb_cInteger, "lcm", rb_lcm, 1); rb_define_method(rb_cInteger, "gcdlcm", rb_gcdlcm, 1); rb_define_method(rb_cNilClass, "to_r", nilclass_to_r, 0); rb_define_method(rb_cInteger, "to_r", integer_to_r, 0); rb_define_method(rb_cFloat, "to_r", float_to_r, 0); make_patterns(); rb_define_method(rb_cString, "to_r", string_to_r, 0); rb_define_singleton_method(rb_cRational, "convert", nurat_s_convert, -1); rb_funcall(rb_cRational, rb_intern("private_class_method"), 1, ID2SYM(rb_intern("convert"))); rb_include_module(rb_cRational, rb_mPrecision); rb_define_singleton_method(rb_cRational, "induced_from", nurat_s_induced_from, 1); }
void Init_Complex(void) { #undef rb_intern #define rb_intern(str) rb_intern_const(str) assert(fprintf(stderr, "assert() is now active\n")); id_abs = rb_intern("abs"); id_abs2 = rb_intern("abs2"); id_arg = rb_intern("arg"); id_cmp = rb_intern("<=>"); id_conj = rb_intern("conj"); id_convert = rb_intern("convert"); id_denominator = rb_intern("denominator"); id_divmod = rb_intern("divmod"); id_equal_p = rb_intern("=="); id_expt = rb_intern("**"); id_floor = rb_intern("floor"); id_hash = rb_intern("hash"); id_idiv = rb_intern("div"); id_inspect = rb_intern("inspect"); id_negate = rb_intern("-@"); id_numerator = rb_intern("numerator"); id_polar = rb_intern("polar"); id_quo = rb_intern("quo"); id_real_p = rb_intern("real?"); id_to_f = rb_intern("to_f"); id_to_i = rb_intern("to_i"); id_to_r = rb_intern("to_r"); id_to_s = rb_intern("to_s"); rb_cComplex = rb_define_class(COMPLEX_NAME, rb_cNumeric); rb_define_alloc_func(rb_cComplex, nucomp_s_alloc); rb_undef_method(CLASS_OF(rb_cComplex), "allocate"); #if 0 rb_define_private_method(CLASS_OF(rb_cComplex), "new!", nucomp_s_new_bang, -1); rb_define_private_method(CLASS_OF(rb_cComplex), "new", nucomp_s_new, -1); #else rb_undef_method(CLASS_OF(rb_cComplex), "new"); #endif rb_define_singleton_method(rb_cComplex, "rectangular", nucomp_s_new, -1); rb_define_singleton_method(rb_cComplex, "rect", nucomp_s_new, -1); rb_define_singleton_method(rb_cComplex, "polar", nucomp_s_polar, 2); rb_define_global_function(COMPLEX_NAME, nucomp_f_complex, -1); rb_undef_method(rb_cComplex, "<"); rb_undef_method(rb_cComplex, "<="); rb_undef_method(rb_cComplex, "<=>"); rb_undef_method(rb_cComplex, ">"); rb_undef_method(rb_cComplex, ">="); rb_undef_method(rb_cComplex, "between?"); rb_undef_method(rb_cComplex, "divmod"); rb_undef_method(rb_cComplex, "floor"); rb_undef_method(rb_cComplex, "ceil"); rb_undef_method(rb_cComplex, "modulo"); rb_undef_method(rb_cComplex, "round"); rb_undef_method(rb_cComplex, "step"); rb_undef_method(rb_cComplex, "truncate"); #if 0 /* NUBY */ rb_undef_method(rb_cComplex, "//"); #endif rb_define_method(rb_cComplex, "real", nucomp_real, 0); rb_define_method(rb_cComplex, "imaginary", nucomp_imag, 0); rb_define_method(rb_cComplex, "imag", nucomp_imag, 0); rb_define_method(rb_cComplex, "-@", nucomp_negate, 0); rb_define_method(rb_cComplex, "+", nucomp_add, 1); rb_define_method(rb_cComplex, "-", nucomp_sub, 1); rb_define_method(rb_cComplex, "*", nucomp_mul, 1); rb_define_method(rb_cComplex, "/", nucomp_div, 1); rb_define_method(rb_cComplex, "quo", nucomp_quo, 1); rb_define_method(rb_cComplex, "fdiv", nucomp_fdiv, 1); rb_define_method(rb_cComplex, "**", nucomp_expt, 1); rb_define_method(rb_cComplex, "==", nucomp_equal_p, 1); rb_define_method(rb_cComplex, "coerce", nucomp_coerce, 1); rb_define_method(rb_cComplex, "abs", nucomp_abs, 0); rb_define_method(rb_cComplex, "magnitude", nucomp_abs, 0); rb_define_method(rb_cComplex, "abs2", nucomp_abs2, 0); rb_define_method(rb_cComplex, "arg", nucomp_arg, 0); rb_define_method(rb_cComplex, "angle", nucomp_arg, 0); rb_define_method(rb_cComplex, "phase", nucomp_arg, 0); rb_define_method(rb_cComplex, "rectangular", nucomp_rect, 0); rb_define_method(rb_cComplex, "rect", nucomp_rect, 0); rb_define_method(rb_cComplex, "polar", nucomp_polar, 0); rb_define_method(rb_cComplex, "conjugate", nucomp_conj, 0); rb_define_method(rb_cComplex, "conj", nucomp_conj, 0); #if 0 rb_define_method(rb_cComplex, "~", nucomp_conj, 0); /* gcc */ #endif rb_define_method(rb_cComplex, "real?", nucomp_false, 0); #if 0 rb_define_method(rb_cComplex, "complex?", nucomp_true, 0); rb_define_method(rb_cComplex, "exact?", nucomp_exact_p, 0); rb_define_method(rb_cComplex, "inexact?", nucomp_inexact_p, 0); #endif rb_define_method(rb_cComplex, "numerator", nucomp_numerator, 0); rb_define_method(rb_cComplex, "denominator", nucomp_denominator, 0); rb_define_method(rb_cComplex, "hash", nucomp_hash, 0); rb_define_method(rb_cComplex, "eql?", nucomp_eql_p, 1); rb_define_method(rb_cComplex, "to_s", nucomp_to_s, 0); rb_define_method(rb_cComplex, "inspect", nucomp_inspect, 0); rb_define_method(rb_cComplex, "marshal_dump", nucomp_marshal_dump, 0); rb_define_method(rb_cComplex, "marshal_load", nucomp_marshal_load, 1); /* --- */ rb_define_method(rb_cComplex, "to_i", nucomp_to_i, 0); rb_define_method(rb_cComplex, "to_f", nucomp_to_f, 0); rb_define_method(rb_cComplex, "to_r", nucomp_to_r, 0); rb_define_method(rb_cNilClass, "to_c", nilclass_to_c, 0); rb_define_method(rb_cNumeric, "to_c", numeric_to_c, 0); make_patterns(); rb_define_method(rb_cString, "to_c", string_to_c, 0); rb_define_private_method(CLASS_OF(rb_cComplex), "convert", nucomp_s_convert, -1); /* --- */ rb_define_method(rb_cNumeric, "real", numeric_real, 0); rb_define_method(rb_cNumeric, "imaginary", numeric_imag, 0); rb_define_method(rb_cNumeric, "imag", numeric_imag, 0); rb_define_method(rb_cNumeric, "abs2", numeric_abs2, 0); rb_define_method(rb_cNumeric, "arg", numeric_arg, 0); rb_define_method(rb_cNumeric, "angle", numeric_arg, 0); rb_define_method(rb_cNumeric, "phase", numeric_arg, 0); rb_define_method(rb_cNumeric, "rectangular", numeric_rect, 0); rb_define_method(rb_cNumeric, "rect", numeric_rect, 0); rb_define_method(rb_cNumeric, "polar", numeric_polar, 0); rb_define_method(rb_cNumeric, "conjugate", numeric_conj, 0); rb_define_method(rb_cNumeric, "conj", numeric_conj, 0); rb_define_const(rb_cComplex, "I", f_complex_new_bang2(rb_cComplex, ZERO, ONE)); }