# Piecewise linear approximation # Oscar Gustafsson, address@hidden param inputbits, integer, > 0; param partitionbits, integer, > 0; param part1bits, integer; param integerbitsoffset := 16; param integerbitsslope := 16; 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; param fracweight := 2^(inputbits-partitionbits); param pi := 3.14159265; param f{y in Y, z in Z} := sin(X[y,z]/2^inputbits*pi/2); var p{y in Y}, integer; var q{y in Y}, integer; var error>=0; minimize e: error; s.t. postive{y in Y, z in Z}: p[y]/(2^integerbitsoffset) + z/fracweight*q[y]/(2^integerbitsslope) - f[y,z] <= error; s.t. negative{y in Y, z in Z}: -(p[y]/(2^integerbitsoffset) + z/fracweight*q[y]/(2^integerbitsslope) - f[y,z]) <= error; solve; display p; display q; end;