mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
complex.c: implement Complex addition and subtraction in C.
This commit is contained in:
@@ -19,22 +19,6 @@ class Complex < Numeric
|
||||
Complex(-real, -imaginary)
|
||||
end
|
||||
|
||||
def +(rhs)
|
||||
if rhs.is_a? Complex
|
||||
Complex(real + rhs.real, imaginary + rhs.imaginary)
|
||||
elsif rhs.is_a? Numeric
|
||||
Complex(real + rhs, imaginary)
|
||||
end
|
||||
end
|
||||
|
||||
def -(rhs)
|
||||
if rhs.is_a? Complex
|
||||
Complex(real - rhs.real, imaginary - rhs.imaginary)
|
||||
elsif rhs.is_a? Numeric
|
||||
Complex(real - rhs, imaginary)
|
||||
end
|
||||
end
|
||||
|
||||
def abs
|
||||
Math.hypot imaginary, real
|
||||
end
|
||||
|
||||
@@ -171,6 +171,48 @@ complex_eq(mrb_state *mrb, mrb_value x)
|
||||
return mrb_bool_value(mrb_complex_eq(mrb, x, y));
|
||||
}
|
||||
|
||||
static mrb_value
|
||||
complex_add(mrb_state *mrb, mrb_value x)
|
||||
{
|
||||
mrb_value y = mrb_get_arg1(mrb);
|
||||
struct mrb_complex *p1 = complex_ptr(mrb, x);
|
||||
|
||||
switch (mrb_type(y)) {
|
||||
case MRB_TT_COMPLEX:
|
||||
{
|
||||
struct mrb_complex *p2 = complex_ptr(mrb, y);
|
||||
return mrb_complex_new(mrb, p1->real+p2->real, p1->imaginary+p2->imaginary);
|
||||
}
|
||||
|
||||
default:
|
||||
{
|
||||
mrb_float z = mrb_to_flo(mrb, y);
|
||||
return mrb_complex_new(mrb, p1->real+z, p1->imaginary);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static mrb_value
|
||||
complex_sub(mrb_state *mrb, mrb_value x)
|
||||
{
|
||||
mrb_value y = mrb_get_arg1(mrb);
|
||||
struct mrb_complex *p1 = complex_ptr(mrb, x);
|
||||
|
||||
switch (mrb_type(y)) {
|
||||
case MRB_TT_COMPLEX:
|
||||
{
|
||||
struct mrb_complex *p2 = complex_ptr(mrb, y);
|
||||
return mrb_complex_new(mrb, p1->real-p2->real, p1->imaginary-p2->imaginary);
|
||||
}
|
||||
|
||||
default:
|
||||
{
|
||||
mrb_float z = mrb_to_flo(mrb, y);
|
||||
return mrb_complex_new(mrb, p1->real-z, p1->imaginary);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static mrb_value
|
||||
complex_mul(mrb_state *mrb, mrb_value x)
|
||||
{
|
||||
@@ -386,6 +428,8 @@ void mrb_mruby_complex_gem_init(mrb_state *mrb)
|
||||
mrb_define_method(mrb, comp, "to_f", complex_to_f, MRB_ARGS_NONE());
|
||||
mrb_define_method(mrb, comp, "to_i", complex_to_i, MRB_ARGS_NONE());
|
||||
mrb_define_method(mrb, comp, "to_c", complex_to_c, MRB_ARGS_NONE());
|
||||
mrb_define_method(mrb, comp, "+", complex_add, MRB_ARGS_REQ(1));
|
||||
mrb_define_method(mrb, comp, "-", complex_sub, MRB_ARGS_REQ(1));
|
||||
mrb_define_method(mrb, comp, "*", complex_mul, MRB_ARGS_REQ(1));
|
||||
mrb_define_method(mrb, comp, "/", complex_div, MRB_ARGS_REQ(1));
|
||||
mrb_define_method(mrb, comp, "quo", complex_div, MRB_ARGS_REQ(1));
|
||||
|
||||
Reference in New Issue
Block a user