code: def atan_newton(x, prec):
      if prec >= 100:
          r = math.atan(int((x >> (prec - 53))) / 2.0**53)
      else:
          r = math.atan(int(x) / 2.0**prec)
      prevp = 50
      r = MPZ(int(r * 2.0**53) >> (53 - prevp))
      extra_p = 50
      for wp in giant_steps(prevp, prec):
          wp += extra_p
          r = r << (wp - prevp)
          cos, sin = cos_sin_fixed(r, wp)
          tan = (sin << wp) // cos
          a = ((tan - rshift(x, prec - wp)) << wp) // (
              (MPZ_ONE << wp) + ((tan**2) >> wp)
          )
          r = r - a
          prevp = wp
      return rshift(r, prevp - prec)
  
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 28 for calling a global function with example usage: atan_newton(x, prec) and returns: rshift