code: def _apply_function_in_context(cls, f, args, context):
      
      rounding = context.rounding
      bf = mpfr.Mpfr_t.__new__(cls)
      mpfr.mpfr_init2(bf, context.precision)
      args = (bf,) + args + (rounding,)
      ternary = f(*args)
      with _temporary_exponent_bounds(context.emin, context.emax):
          ternary = mpfr.mpfr_check_range(bf, ternary, rounding)
          if context.subnormalize:
              # mpfr_subnormalize doesn't set underflow and
              # subnormal flags, so we do that ourselves.  We choose
              # to set the underflow flag for *all* cases where the
              # 'after rounding' result is smaller than the smallest
              # normal number, even if that result is exact.
  
              # if bf is zero but ternary is nonzero, the underflow
              # flag will already have been set by mpfr_check_range;
              underflow = (
                  mpfr.mpfr_number_p(bf) and
                  not mpfr.mpfr_zero_p(bf) and
                  mpfr.mpfr_get_exp(bf) < context.precision - 1 + context.emin)
              if underflow:
                  mpfr.mpfr_set_underflow()
              ternary = mpfr.mpfr_subnormalize(bf, ternary, rounding)
              if ternary:
                  mpfr.mpfr_set_inexflag()
      return bf
docs: Apply an MPFR function 'f' to the given arguments 'args', rounding to
      the given context.  Returns a new Mpfr object with precision taken from
      the current context.