# Piecewise linear approximation # Oscar Gustafsson, address@hidden param inputbits := 12; param partitionbits := 5; param coeffbits := 12; set Y := {0..(2^partitionbits-1)}; set Z := {0..(2^(inputbits-partitionbits)-1)}; param X{y in Y, z in Z} := (2^(inputbits-partitionbits)*y + z)/2^inputbits; var p{y in Y} integer; var q{y in Y} integer; var error>=0; s.t. postive{y in Y, z in Z}: (p[y] + z*q[y]/2^(inputbits))/2^coeffbits - cos(X[y,z]) <= error; s.t. negative{y in Y, z in Z}: -((p[y] + z*q[y]/2^(inputbits))/2^coeffbits - cos(X[y,z])) <= error; minimize e: error; solve; printf "p = [" ; for {y in Y} { printf " %d", p[y] ; } printf("];\n"); printf("q = ["); for {y in Y} { printf "%d ", q[y]; } printf("];\n"); end;