#define pi 3.1415926535
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

const double unit = 2.0 * pi / 256.0;
const double half = pi / 256.0;

int gentest(int factor, int i) {
  while ((int)round(tan(unit*i+half)*factor) > 255) factor = factor/2;
  fprintf(stdout, "if ((long)x*%dL > y*%dL) return map[quadrant][%d]; // tan(%d.5)*%d\n", factor, (int)round(tan(unit*i+half)*factor), i, i, factor);
}

void splittest(int i, int lo, int hi) {
  int factor = 128;  
  while ((int)round(tan(unit*i+half)*factor) > 255) factor = factor/2;

  if ((i==hi) && (hi==lo)) {
    fprintf(stdout, "  return map[quadrant][%d]; // tan(%d.5)*%d  hi==lo\n", i, i, factor);
    return;
  }
  
  if ((hi==lo+1) && (i==lo)) {
    fprintf(stdout, "if ((long)x*%dL > y*%dL)\n", factor, (int)round(tan(unit*i+half)*factor));
    i++;
    fprintf(stdout, "  return map[quadrant][%d]; // tan(%d.5)*%d\n", i, i, factor);
    i--;factor = 128;
    while ((int)round(tan(unit*i+half)*factor) > 255) factor = factor/2;
    fprintf(stdout, "else\n");
    fprintf(stdout, "  return map[quadrant][%d]; // tan(%d.5)*%d\n", i, i, factor);
    return;
  }
  fprintf(stdout, "if ((long)x*%dL > y*%dL) {\n", factor, (int)round(tan(unit*i+half)*factor));
  splittest((i+1+hi)/2, i+1, hi);
  fprintf(stdout, "} else {\n");
  splittest((i+lo)/2, lo, i);
  fprintf(stdout, "}\n");
}

int main(int argc, char **argv) {
  int i;
  for (i = 0; i <= 63; i++) { // linear search version...
    gentest(128, i);
  }
  fprintf(stdout, "else\n  return map[quadrant][64]; // tan(64.0)\n");
  splittest(32, 0, 64);
  exit(0);
}

