int logsinTable[256]; int expTable[256]; void initTables() { for (int i = 0; i < 256; ++i) { logsinTable[i] = round(-log2(sin((i + 0.5) * M_PI_2 / 256.0)) * 256.0); expTable[i] = round(exp2(i / 256.0) * 1024.0) - 1024; } } int lookupSin(int val) { bool sign = val & 512; bool mirror = val & 256; val &= 255; int result = logsinTable[mirror ? val ^ 255 : val]; if (sign) result |= 0x8000; return result; } int lookupExp(int val) { bool sign = val & 0x8000; int t = (expTable[(val & 255) ^ 255] | 1024) << 1; int result = t >> ((val & 0x7F00) >> 8); if (sign) result = ~result; return result >> 4; }