2 ** numeric.c - Numeric, Integer, Float class
4 ** See Copyright Notice in mruby.h
8 #include <mruby/numeric.h>
9 #include <mruby/internal.h>
10 #include <mruby/presym.h>
13 mrb_num_add(mrb_state
*mrb
, mrb_value x
, mrb_value y
)
16 if (mrb_bigint_p(x
)) {
17 return mrb_bint_add(mrb
, x
, y
);
20 if (mrb_integer_p(x
)) {
21 return mrb_int_add(mrb
, x
, y
);
25 return mrb_float_value(mrb
, mrb_float(x
) + mrb_as_float(mrb
, y
));
28 #if defined(MRB_USE_RATIONAL) || defined(MRB_USE_COMPLEX)
29 switch (mrb_type(x
)) {
30 #if defined(MRB_USE_RATIONAL)
32 return mrb_rational_add(mrb
, x
, y
);
34 #if defined(MRB_USE_COMPLEX)
36 return mrb_complex_add(mrb
, x
, y
);
42 mrb_raise(mrb
, E_TYPE_ERROR
, "no number addition");
43 return mrb_nil_value(); /* not reached */
47 mrb_num_sub(mrb_state
*mrb
, mrb_value x
, mrb_value y
)
50 if (mrb_bigint_p(x
)) {
51 return mrb_bint_sub(mrb
, x
, y
);
54 if (mrb_integer_p(x
)) {
55 return mrb_int_sub(mrb
, x
, y
);
59 return mrb_float_value(mrb
, mrb_float(x
) - mrb_as_float(mrb
, y
));
62 #if defined(MRB_USE_RATIONAL) || defined(MRB_USE_COMPLEX)
63 switch (mrb_type(x
)) {
64 #if defined(MRB_USE_RATIONAL)
66 return mrb_rational_sub(mrb
, x
, y
);
68 #if defined(MRB_USE_COMPLEX)
70 return mrb_complex_sub(mrb
, x
, y
);
76 mrb_raise(mrb
, E_TYPE_ERROR
, "no number subtraction");
77 return mrb_nil_value(); /* not reached */
81 mrb_num_mul(mrb_state
*mrb
, mrb_value x
, mrb_value y
)
84 if (mrb_bigint_p(x
)) {
85 return mrb_bint_mul(mrb
, x
, y
);
88 if (mrb_integer_p(x
)) {
89 return mrb_int_mul(mrb
, x
, y
);
93 return mrb_float_value(mrb
, mrb_float(x
) * mrb_as_float(mrb
, y
));
96 #if defined(MRB_USE_RATIONAL) || defined(MRB_USE_COMPLEX)
97 switch (mrb_type(x
)) {
98 #if defined(MRB_USE_RATIONAL)
100 return mrb_rational_mul(mrb
, x
, y
);
102 #if defined(MRB_USE_COMPLEX)
104 return mrb_complex_mul(mrb
, x
, y
);
110 mrb_raise(mrb
, E_TYPE_ERROR
, "no number multiply");
111 return mrb_nil_value(); /* not reached */