exponential polynomial approximation #1346
Open
+95
−16
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
This pull request introduces a new implementations of
glm::fastPow,
glm::fastExp,
glm::fastExp2,
glm::fastLog,
glm::fastLog2.
These functions are numerically stable, even for large values.Btw. I made a pull request before #1332 with the same purpose, but I closed it because I was still trying to find a more efficient code.
ALGORITHM
In this approximation I used Horner's method for polynomial evaluation
((((x + C0) * x + C1) * x + C2) * x + C3)
where
C0
-Cn
are coefficents calculated using the Remez Algorithm.exp2()
interval [0, 1], one and two degree polynomial (exp2
works more efficiently in IEEE 754 float)log()
interval[1, 2], two degree polynomialpow(),
uses 4 degree polynomial for bothexp
andlog
SPECIAL CASES
these are not implemented for performance reasons
• glm::fastPow
If y is negative
1 / glm::fastPow(x, abs(-y));
If x is less than 1 (e.g 0.4, 0.5...)
1 / glm::fastPow(1 / x, y);
• glm::fastExp, glm::fastExp2
If x is negative
1 / glm::fastExp(abs(-x));
• glm::fastLog, glm::fastLog2
If x is less than 1 (e.g 0.7, 0.8...)
-glm::fastLog(1 / x);
ERROR
• glm::fastPow
• glm::fastExp
• glm::fastExp2
• glm::fastLog
• glm::fastLog2
PERFORMANCE TEST