code: def mpf_acos(x, prec, rnd=round_fast):
      # acos(x) = 2*atan(sqrt(1-x**2)/(1+x))
      sign, man, exp, bc = x
      if bc + exp > 0:
          if x not in (fone, fnone):
              raise ComplexResult(
                  "acos(x) is real only for -1 <= x <= 1"
              )
          if x == fnone:
              return mpf_pi(prec, rnd)
      wp = prec + 15
      a = mpf_mul(x, x)
      b = mpf_sqrt(mpf_sub(fone, a, wp), wp)
      c = mpf_div(b, mpf_add(fone, x, wp), wp)
      return mpf_shift(mpf_atan(c, prec, rnd), 1)
  
imports: import math
  from bisect import bisect
  from .backend import xrange
  from .backend import MPZ, MPZ_ZERO, MPZ_ONE, MPZ_TWO, MPZ_FIVE, BACKEND
  from .libmpf import round_floor, round_ceiling, round_down, round_up, round_nearest, round_fast, ComplexResult, bitcount, bctable, lshift, rshift, giant_steps, sqrt_fixed, from_int, to_int, from_man_exp, to_fixed, to_float, from_float, from_rational, normalize, fzero, fone, fnone, fhalf, finf, fninf, fnan, mpf_cmp, mpf_sign, mpf_abs, mpf_pos, mpf_neg, mpf_add, mpf_sub, mpf_mul, mpf_div, mpf_shift, mpf_rdiv_int, mpf_pow_int, mpf_sqrt, reciprocal_rnd, negative_rnd, mpf_perturb, isqrt_fast
  from .libintmath import ifib
label_desc: Use image node_id 35 for calling a global function with example usage: mpf_acos(x, prec, rnd) and returns: mpf_shift, mpf_pi