From 84e7098963a324a4d5b096686553355d8b09b2b1 Mon Sep 17 00:00:00 2001 From: Louis Rubet Date: Fri, 16 Jun 2017 09:32:47 +0200 Subject: [PATCH] #132: complex chs neg inv --- src/rpn-real.hpp | 37 +++++++++++++++++++++++++++++++------ test/10-complex.txt | 20 ++++++++++++++++++++ 2 files changed, 51 insertions(+), 6 deletions(-) diff --git a/src/rpn-real.hpp b/src/rpn-real.hpp index d3d8c5d..565b98b 100644 --- a/src/rpn-real.hpp +++ b/src/rpn-real.hpp @@ -237,19 +237,44 @@ void div() void neg() { MIN_ARGUMENTS(1); - ARG_MUST_BE_OF_TYPE(0, cmd_number); - number* left = (number*)_stack->back(); - CHECK_MPFR(mpfr_neg(left->_value.mpfr, left->_value.mpfr, floating_t::s_mpfr_rnd)); + if (_stack->get_type(0) == cmd_number) + { + number* left = (number*)_stack->back(); + CHECK_MPFR(mpfr_neg(left->_value.mpfr, left->_value.mpfr, floating_t::s_mpfr_rnd)); + } + else if (_stack->get_type(0) == cmd_complex) + { + complex* left = (complex*)_stack->back(); + CHECK_MPFR(mpfr_neg(left->re()->mpfr, left->re()->mpfr, floating_t::s_mpfr_rnd)); + CHECK_MPFR(mpfr_neg(left->im()->mpfr, left->im()->mpfr, floating_t::s_mpfr_rnd)); + } + else + ERR_CONTEXT(ret_bad_operand_type); } void inv() { MIN_ARGUMENTS(1); - ARG_MUST_BE_OF_TYPE(0, cmd_number); - number* left = (number*)_stack->back(); - CHECK_MPFR(mpfr_si_div(left->_value.mpfr, 1L, left->_value.mpfr, floating_t::s_mpfr_rnd)); + if (_stack->get_type(0) == cmd_number) + { + number* left = (number*)_stack->back(); + CHECK_MPFR(mpfr_si_div(left->_value.mpfr, 1L, left->_value.mpfr, floating_t::s_mpfr_rnd)); + } + else if (_stack->get_type(0) == cmd_complex) + { + //1. duplicate + dup(); + //2. set complex level 2 to (1,0) + complex* cplx = (complex*)_stack->get_obj(1); + CHECK_MPFR(mpfr_set_ui(cplx->re()->mpfr, 1UL, floating_t::s_mpfr_rnd)); + CHECK_MPFR(mpfr_set_ui(cplx->im()->mpfr, 0UL, floating_t::s_mpfr_rnd)); + //3. divide + do_divide_complexes(); + } + else + ERR_CONTEXT(ret_bad_operand_type); } void purcent() diff --git a/test/10-complex.txt b/test/10-complex.txt index 487fffb..267759f 100644 --- a/test/10-complex.txt +++ b/test/10-complex.txt @@ -121,3 +121,23 @@ drop re -> error should be 2 drop + +# chs +(3.14,6.28) chs +-> stack should be (-3.14,-6.28) +drop + +# neg +(-3.14,-6.28) neg +-> stack should be (3.14,6.28) +drop + +# inv (1) +(2,4) inv +-> stack should be (0.1,-0.2) +drop + +# inv (2) +(0.1,-0.2) inv +-> stack should be (2,4) +drop