extern "C" Box* complexDivInt(BoxedComplex* lhs, BoxedInt* rhs) { assert(lhs->cls == complex_cls); assert(rhs->cls == int_cls); if (rhs->n == 0) { raiseDivZeroExc(); } return boxComplex(lhs->real / (double)rhs->n, lhs->imag / (double)rhs->n); }
extern "C" Box* complexDivFloat(BoxedComplex* lhs, BoxedFloat* rhs) { assert(lhs->cls == complex_cls); assert(rhs->cls == float_cls); if (rhs->d == 0.0) { raiseDivZeroExc(); } return boxComplex(lhs->real / rhs->d, lhs->imag / rhs->d); }
extern "C" Box* complexSubInt(BoxedComplex* lhs, BoxedInt* rhs) { assert(lhs->cls == complex_cls); assert(rhs->cls == int_cls); return boxComplex(lhs->real - (double)rhs->n, lhs->imag); }
extern "C" Box* complexSubFloat(BoxedComplex* lhs, BoxedFloat* rhs) { assert(lhs->cls == complex_cls); assert(rhs->cls == float_cls); return boxComplex(lhs->real - rhs->d, lhs->imag); }
extern "C" Box* complexSubComplex(BoxedComplex* lhs, BoxedComplex* rhs) { assert(lhs->cls == complex_cls); assert(rhs->cls == complex_cls); return boxComplex(lhs->real - rhs->real, lhs->imag - rhs->imag); }
extern "C" Box* complexMulComplex(BoxedComplex* lhs, BoxedComplex* rhs) { assert(lhs->cls == complex_cls); assert(rhs->cls == complex_cls); return boxComplex(lhs->real * rhs->real - lhs->imag * rhs->imag, lhs->real * rhs->imag + lhs->imag * rhs->real); }
extern "C" Box* complexAddInt(BoxedComplex* lhs, BoxedInt* rhs) { assert(lhs->cls == complex_cls); assert(isSubclass(rhs->cls, int_cls)); return boxComplex(lhs->real + (double)rhs->n, lhs->imag); }