Implementation of the inverse square root Root.
More...
#include <cassert>
#include <cmath>
#include <iostream>
#include <limits>
|
template<typename T = double, char iterations = 2> |
T | Fast_InvSqrt (T x) |
| for numeric_limits More...
|
|
template<typename T = double> |
T | Standard_InvSqrt (T number) |
| This is the function that calculates the fast inverse square root. The following code is the fast inverse square root with standard lib (cmath) More information can be found at LinkedIn More...
|
|
static void | test () |
| Self-test implementations. More...
|
|
int | main () |
| Main function. More...
|
|
Implementation of the inverse square root Root.
Two implementation to calculate inverse inverse root, from Quake III Arena (C++ version) and with a standard library (cmath
). This algorithm is used to calculate shadows in Quake III Arena.
◆ Fast_InvSqrt()
template<typename T = double, char iterations = 2>
for numeric_limits
for assert for std::sqrt
for IO operations
This is the function that calculates the fast inverse square root. The following code is the fast inverse square root implementation from Quake III Arena (Adapted for C++). More information can be found at Wikipedia
- Template Parameters
-
T | floating type |
iterations | inverse square root, the greater the number of iterations, the more exact the result will be (1 or 2). |
- Parameters
-
- Returns
- the inverse square root
28 {
31 T y = x;
32 T x2 = y * 0.5;
33
34 Tint i =
35 *reinterpret_cast<Tint *>(&y);
36
37 i = (sizeof(T) == 8 ? 0x5fe6eb50c7b537a9 : 0x5f3759df) -
38 (i >> 1);
39
40 y = *reinterpret_cast<T *>(&i);
41
42 y = y * (1.5 - (x2 * y * y));
43 if (iterations == 2) {
44 y = y * (1.5 - (x2 * y * y));
45 }
46 return y;
47}
◆ main()
Main function.
- Returns
- 0 on exit
87 {
89 std::cout <<
"The Fast inverse square root of 36 is: "
90 << Fast_InvSqrt<float, 1>(36.0f) <<
std::endl;
91 std::cout <<
"The Fast inverse square root of 36 is: "
92 << Fast_InvSqrt<double, 2>(36.0f) << " (2 iterations)"
94 std::cout <<
"The Fast inverse square root of 100 is: "
96 << " (With default template type and iterations: double, 2)"
98 std::cout <<
"The Standard inverse square root of 36 is: "
99 << Standard_InvSqrt<float>(36.0f) <<
std::endl;
100 std::cout <<
"The Standard inverse square root of 100 is: "
102 <<
" (With default template type: double)" <<
std::endl;
103}
T Standard_InvSqrt(T number)
This is the function that calculates the fast inverse square root. The following code is the fast inv...
Definition: inv_sqrt.cpp:59
static void test()
Self-test implementations.
Definition: inv_sqrt.cpp:68
T Fast_InvSqrt(T x)
for numeric_limits
Definition: inv_sqrt.cpp:28
◆ Standard_InvSqrt()
template<typename T = double>
T Standard_InvSqrt |
( |
T |
number | ) |
|
This is the function that calculates the fast inverse square root. The following code is the fast inverse square root with standard lib (cmath) More information can be found at LinkedIn
- Template Parameters
-
- Parameters
-
- Returns
- the inverse square root
59 {
60 T squareRoot =
sqrt(number);
61 return 1.0f / squareRoot;
62}
◆ test()
Self-test implementations.
- Returns
- void
68 {
69 const float epsilon = 1e-3f;
70
71
72 assert(
std::fabs(Standard_InvSqrt<float>(100.0f) - 0.0998449f) < epsilon);
73 assert(
std::fabs(Standard_InvSqrt<double>(36.0f) - 0.166667f) < epsilon);
75 assert(
std::fabs(Standard_InvSqrt<double>(5.0f) - 0.447141f) < epsilon);
76
77 assert(
std::fabs(Fast_InvSqrt<float, 1>(100.0f) - 0.0998449f) < epsilon);
78 assert(
std::fabs(Fast_InvSqrt<double, 1>(36.0f) - 0.166667f) < epsilon);
80 assert(
std::fabs(Fast_InvSqrt<double>(5.0f) - 0.447141) < epsilon);
81}