mirror of
https://github.com/louisrubet/rpn
synced 2025-01-30 20:34:30 +01:00
#132: added complex abs
This commit is contained in:
parent
2f41fb4c60
commit
ee1d99834a
2 changed files with 33 additions and 3 deletions
|
@ -347,11 +347,36 @@ void modulo()
|
|||
void rpn_abs()
|
||||
{
|
||||
MIN_ARGUMENTS(1);
|
||||
ARG_MUST_BE_OF_TYPE(0, cmd_number);
|
||||
|
||||
number* left = (number*)_stack->back();
|
||||
if (_stack->get_type(0) == cmd_number)
|
||||
{
|
||||
number* left = (number*)_stack->back();
|
||||
CHECK_MPFR(mpfr_abs(left->_value.mpfr, left->_value.mpfr, floating_t::s_mpfr_rnd));
|
||||
}
|
||||
else if (_stack->get_type(0) == cmd_complex)
|
||||
{
|
||||
//1. copy out -> calc x2+iy2
|
||||
stack::copy_and_push_back(*_stack, _stack->size()-1, _branch_stack);
|
||||
_stack->pop_back();
|
||||
|
||||
CHECK_MPFR(mpfr_abs(left->_value.mpfr, left->_value.mpfr, floating_t::s_mpfr_rnd));
|
||||
//2. calc x2+iy2
|
||||
complex* cplx = (complex*)_branch_stack.back();
|
||||
CHECK_MPFR(mpfr_mul(cplx->re()->mpfr, cplx->re()->mpfr, cplx->re()->mpfr, floating_t::s_mpfr_rnd));
|
||||
CHECK_MPFR(mpfr_mul(cplx->im()->mpfr, cplx->im()->mpfr, cplx->im()->mpfr, floating_t::s_mpfr_rnd));
|
||||
|
||||
//3. new real on stack
|
||||
_stack->allocate_back(number::calc_size(), cmd_number);
|
||||
number* module = (number*)_stack->back();
|
||||
|
||||
//4. set it to |x2+y2| then take sqrt
|
||||
CHECK_MPFR(mpfr_set(module->_value.mpfr, cplx->re()->mpfr, floating_t::s_mpfr_rnd));
|
||||
CHECK_MPFR(mpfr_add(module->_value.mpfr, module->_value.mpfr, cplx->im()->mpfr, floating_t::s_mpfr_rnd));
|
||||
CHECK_MPFR(mpfr_sqrt(module->_value.mpfr, module->_value.mpfr, floating_t::s_mpfr_rnd));
|
||||
|
||||
_branch_stack.pop_back();
|
||||
}
|
||||
else
|
||||
ERR_CONTEXT(ret_bad_operand_type);
|
||||
}
|
||||
|
||||
void hex()
|
||||
|
|
|
@ -141,3 +141,8 @@ drop
|
|||
(0.1,-0.2) inv
|
||||
-> stack should be (2,4)
|
||||
drop
|
||||
|
||||
# abs
|
||||
(3,4) abs
|
||||
-> stack should be 5
|
||||
drop
|
||||
|
|
Loading…
Add table
Reference in a new issue