diff --git a/src/program.cpp b/src/program.cpp index 6fa2257..5e8882c 100644 --- a/src/program.cpp +++ b/src/program.cpp @@ -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" }, diff --git a/src/rpn-real.hpp b/src/rpn-real.hpp index 0088210..9b2ad6e 100644 --- a/src/rpn-real.hpp +++ b/src/rpn-real.hpp @@ -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);