short SinShortLP(short angle) { // -32768 <= angle <= +32767 equaling -180 <= degrees < +180 or -Pi <= radians < +Pi // Returns -16384 <= return <= +16384 equaling -1 <= Sin(angle) <= +1 // Non power of 2 scalings are more complex, as the multiplier has to be chosen to keep precision short multiplier = (short) ( (angle < (short)0) ? (short)32767 + angle // short + short => short; -1 <= multiplier <= +32767 : (short)32767 - angle // short - short => short; -1 <= multiplier <= +32767 ); return (short) ( ( angle * multiplier // short * short => int; -268468224 <= unscaled <= +268468224 + angle // added to compensate for using 32767 for multiplier // int + short => int; -268435456 <= unscaled <= +268435456 + (int)8192 // + 8192 to round to nearest 16384; int + int => int ) >> 14 // >> 14 same as divide by 16384; cast to short -16384 <= return <= +16384 ); } short SinShortHP(short angle) { // -32768 <= angle <= +32767 equaling -180 <= degrees < +180 or -Pi <= radians < +Pi // Returns -16384 <= return <= +16384 equaling -1 <= Sin(angle) <= +1 // Non power of 2 scalings are more complex, as the multiplier has to be chosen to keep precision short multiplier = (short) ( (angle < (short)0) ? (short)32767 + angle // short + short => short; -1 <= multiplier <= +32767 : (short)32767 - angle // short - short => short; -1 <= multiplier <= +32767 ); int unscaled = angle * multiplier // short * short => int; -268468224 <= unscaled <= +268468224 + angle; // added to compensate for using 32767 for multiplier // int + short => int; -268435456 <= unscaled <= +268435456 short scaled = (short)((unscaled + (int)8192) // + 8192 to round to nearest 16384; int + int => int >> 14); // >> 14 is / 16384; cast to short -16384 <= scaled <= +16384 short correction = (short) ( ( ( (scaled < (short)0) ? -scaled * scaled // short * short => int; -268435456 <= int <= 0 : scaled * scaled // short * short => int; 0 <= int <= +268435456 ) - unscaled // int - int => int; ~-67108864 <= int <= ~+67108864; -134217728 <= int <= +134217728 + (int)2048 // + 2048 to round to nearest 4096; int + int => int ) >> 12 // >> 12 is / 4096; ~-16384 <= int <= ~+16384; -32768 <= int <= +32768 ); // cast to short -32768 <= correctionUnscaled <= +32768 return (short) ( ( ( correction * (short)29491 // short * short => int; ~-536870912 <= int <= ~+536870912 + (int)262144 // + 262144 to round to nearest 524288; int + int => int ) >> 19 // >> 19 is / 524288; ~-1024 <= int <= ~+1024 ) + scaled // int + int => int; -16384 <= return <= +16384 ); // cast to short -16384 <= return <= +16384 }