The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
/*
 *  Generate the normalization table for the quantized unit
 *  vector unpacking algorithm.
 *
 *  To make your own table compile this file and run it:
 *  $ gcc geniltab.c -o geniltab -lm
 *  $ ./geniltab
 *
 *  The table is written to "iltab.gen.c" in the current directory.
 *
 */
#include <math.h>
#include <stdio.h>
#include <stdlib.h>

#include "constants.h"

static double t[ILTAB_SIZE];

static void gentab(void) {
  unsigned p, xb, yb;
  double x, y, z;
  for (p = 0; p < ILTAB_SIZE; p++) {
    xb = p >> 7;
    yb = p & BOTTOM_MASK;
    if (xb + yb >= 127) { 
      xb = 127 - xb;
      yb = 127 - yb; 
    }
    x = xb;
    y = yb;
    z = 126.0 - xb - yb;
    t[p] = 1.0 / sqrt(y*y + z*z + x*x);
  }
}

int main(int argc, char **argv) {
  FILE *f;
  int i;
  if (!(f = fopen("iltab.gen.c", "w"))) {
    perror("fopen");
    exit(1);
  }
  gentab();
  fprintf(f, "/* Automatically generated by %s */\n", argv[0]);
  fprintf(f, "static float iltab[] = {\n");
  for (i = 0; i < ILTAB_SIZE - 4; i += 4)
    fprintf(f, "%.12ff, %.12ff, %.12ff, %.12ff,\n", t[i], t[i+1], t[i+2], t[i+3]);
  fprintf(f, "%.12ff, %.12ff, %.12ff, %.12ff\n", t[i], t[i+1], t[i+2], t[i+3]);
  fprintf(f, "};\n");
  fclose(f);
  return 0;
}