# compute arctangent table for CORDIC computations in fttrigon.c
import sys, math

units  = 64*65536.0   # don't change !!
scale  = units/math.pi
shrink = 1.0
comma  = ""

def calc_val( x ):
    global units, shrink
    angle  = math.atan(x)
    shrink = shrink * math.cos(angle)
    return angle/math.pi * units

def  print_val( n, x ):
    global comma

    lo  = int(x)
    hi  = lo + 1
    alo = math.atan(lo)
    ahi = math.atan(hi)
    ax  = math.atan(2.0**n)

    errlo = abs( alo - ax )
    errhi = abs( ahi - ax )
    
    if ( errlo < errhi ):
      hi = lo

    sys.stdout.write( comma + repr( int(hi) ) )
    comma = ", "


print ""
print "table of arctan( 1/2^n ) for PI = " + repr(units/65536.0) + " units"

# compute range of "i"
r = [-1]
r = r + range(32)

for n in r:

    if n >= 0:
        x = 1.0/(2.0**n)    # tangent value
    else:
        x = 2.0**(-n)
      
    angle  = math.atan(x)    # arctangent 
    angle2 = angle*scale     # arctangent in FT_Angle units

    # determine which integer value for angle gives the best tangent
    lo  = int(angle2)
    hi  = lo + 1
    tlo = math.tan(lo/scale)
    thi = math.tan(hi/scale)

    errlo = abs( tlo - x )
    errhi = abs( thi - x )

    angle2 = hi
    if errlo < errhi:
        angle2 = lo

    if angle2 <= 0:
        break
    
    sys.stdout.write( comma + repr( int(angle2) ) )
    comma = ", "
    
    shrink = shrink * math.cos( angle2/scale)
      

print
print "shrink factor    = " + repr( shrink )
print "shrink factor 2  = " + repr( shrink * (2.0**32) )
print "expansion factor = " + repr(1/shrink)
print ""
   