Provide additional math functions.
In the course of implementing QuakeScheme and integrating
Ogg Vorbis,
I had need for additional math functions not provided in
bg_lib.c nor q_math.c.
The file q_math.c is not supposed to be modified (which presumably includes adding functions), so I created a new file.
Additional math functions provided are:
int Q_floor (float x) - largest integer value that doesn't exceed x.
int Q_ceil (float x) - Round x to nearest integer, half-way case rounds towards even number.
int Q_trunc (float x) - Truncates x (removes fractional portion).
int Q_round (float x) - Rounds x to nearest integer, half-way case rounds away from zero.
float Q_exp (float x) - Returns value of the transcendental number e raised to the power of x.
float Q_log (float x) - Returns natural logarithm of x.
float Q_sin (float x) - Returns sine of x.
float Q_cos (float x) - Returns cosine of x.
float Q_tan (float x) - Returns tangent of x.
float Q_asin (float x) - Returns arcsine of x.
float Q_acos (float x) - Returns arccosine of x.
float Q_atan (float x) - Returns arctangent of x.
float Q_atan2 (float y, float x) - Returns arctangent of y/x.
float Q_sqrt (float x) - Returns arctangent of x.
float Q_hypot (float a, float b) - Returns the hypotenuse of a right triange with legs lengths of a and b.
float Q_rint (float x) - Rounds x to nearest integer as float, but (supposed to) raises the inexact exception if the return value differs from x by too much (meaning of "too much" varies...).
long ldexp (double x, int y) - Returns x multiplied by 2 to the power of y (x * 2y).
The logarithmic functions are horridly inaccurate (e.g. 2^5 == exp(5*log(2)) => 32.000003).
The complete set of functions in math.h is not provided.
Q_sin, Q_cos, Q_atan2, and Q_sqrt are just wrappers around the provided syscalls.
Antilogarithm is calculated using a 1024-element antilogarithm lookup table and linear interpolation. The 1024 elements span the domain 1 to e. The range is thus from 0.0 to 1.0. Logarithm is calculated by searching the other side of the table.
Logarithmic functions were developed before the rest of bg_math.c, which is why logs are separated from the rest.
The log lookup table (lntable.frag) was programmatically generated.
Files: