#137: added real commands ip fp floor ceil

This commit is contained in:
Louis Rubet 2017-06-18 23:21:22 +02:00
parent fd61df18ca
commit 35dffadfe8
2 changed files with 44 additions and 0 deletions

View file

@ -56,6 +56,10 @@ program::keyword_t program::s_keywords[] =
{ cmd_keyword, "fact", &program::fact, "n! for integer n or Gamma(x+1) for fractional x" },
{ cmd_keyword, "mant", &program::mant, "mantissa of a real number" },
{ cmd_keyword, "xpon", &program::xpon, "exponant of a real number" },
{ cmd_keyword, "floor", &program::rpn_floor, "largest number <=" },
{ cmd_keyword, "ceil", &program::rpn_ceil, "smallest number >=" },
{ cmd_keyword, "ip", &program::rpn_ip, "integer part" },
{ cmd_keyword, "fp", &program::rpn_fp, "fractional part" },
{ cmd_keyword, "min", &program::rpn_min, "min of 2 real numbers" },
{ cmd_keyword, "max", &program::rpn_max, "max of 2 real numbers" },

View file

@ -550,6 +550,46 @@ void xpon()
ERR_CONTEXT(ret_out_of_range);
}
void rpn_floor()
{
MIN_ARGUMENTS(1);
ARG_MUST_BE_OF_TYPE(0, cmd_number);
number* left = (number*)_stack->back();
CHECK_MPFR(mpfr_floor(left->_value.mpfr, left->_value.mpfr));
}
void rpn_ceil()
{
MIN_ARGUMENTS(1);
ARG_MUST_BE_OF_TYPE(0, cmd_number);
number* left = (number*)_stack->back();
CHECK_MPFR(mpfr_ceil(left->_value.mpfr, left->_value.mpfr));
}
void rpn_fp()
{
MIN_ARGUMENTS(1);
ARG_MUST_BE_OF_TYPE(0, cmd_number);
number* left = (number*)_stack->back();
CHECK_MPFR(mpfr_frac(left->_value.mpfr, left->_value.mpfr, floating_t::s_mpfr_rnd));
}
void rpn_ip()
{
MIN_ARGUMENTS(1);
ARG_MUST_BE_OF_TYPE(0, cmd_number);
number* left = (number*)_stack->back();
CHECK_MPFR(mpfr_trunc(left->_value.mpfr, left->_value.mpfr));
}
void rpn_min()
{
MIN_ARGUMENTS(2);