Provide additional math functions.
In the course of implementing QuakeScheme and integrating
I had need for additional math functions not provided in
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.