parameters: (context, builder, sig, args)
return_statement: return impl_ret_untracked(context, builder, sig.return_type, res)
docstring: a ^ b, where a is an integer or real, and b an integer
docstring_summary: a ^ b, where a is an integer or real, and b an integer
docstring_tokens: a ^ b where a is an integer or real and b an integer
function: def int_power_impl(context, builder, sig, args):
      """
      a ^ b, where a is an integer or real, and b an integer
      """
      is_integer = isinstance(sig.args[0], types.Integer)
      tp = sig.return_type
      zerodiv_return = _get_power_zerodiv_return(context, tp)
  
      def int_power(a, b):
          # Ensure computations are done with a large enough width
          r = tp(1)
          a = tp(a)
          if b < 0:
              invert = True
              exp = -b
              if exp < 0:
                  raise OverflowError
              if is_integer:
                  if a == 0:
                      if zerodiv_return:
                          return zerodiv_return
                      else:
                          raise ZeroDivisionError("0 cannot be raised to a negative power")
                  if a != 1 and a != -1:
                      return 0
          else:
              invert = False
              exp = b
          if exp > 0x10000:
              # Optimization cutoff: fallback on the generic algorithm
              return math.pow(a, float(b))
          while exp != 0:
              if exp & 1:
                  r *= a
              exp >>= 1
              a *= a
  
          return 1.0 / r if invert else r
  
      res = context.compile_internal(builder, int_power, sig, args)
      return impl_ret_untracked(context, builder, sig.return_type, res)
function_tokens: def int_power_impl ( context , builder , sig , args ) : is_integer = isinstance ( sig . args [ 0 ] , types . Integer ) tp = sig . return_type zerodiv_return = _get_power_zerodiv_return ( context , tp ) def int_power ( a , b ) : # Ensure computations are done with a large enough width r = tp ( 1 ) a = tp ( a ) if b < 0 : invert = True exp = - b if exp < 0 : raise OverflowError if is_integer : if a == 0 : if zerodiv_return : return zerodiv_return else : raise ZeroDivisionError ( "0 cannot be raised to a negative power" ) if a != 1 and a != - 1 : return 0 else : invert = False exp = b if exp > 0x10000 : # Optimization cutoff: fallback on the generic algorithm return math . pow ( a , float ( b ) ) while exp != 0 : if exp & 1 : r *= a exp >>= 1 a *= a return 1.0 / r if invert else r res = context . compile_internal ( builder , int_power , sig , args ) return impl_ret_untracked ( context , builder , sig . return_type , res )