Fix fast inverse sqrt (fixes #3199) (#3228)

Co-authored-by: Andrii Siriak <siryaka@gmail.com>
This commit is contained in:
Siddhant Swarup Mallick 2022-08-24 16:07:07 +05:30 committed by GitHub
parent 12a4e27213
commit 2ffcff12fc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 115 additions and 0 deletions

View File

@ -0,0 +1,59 @@
/** Author : Siddhant Swarup Mallick
* Github : https://github.com/siddhant2002
*/
/** Program description - To find out the inverse square root of the given number*/
/** Wikipedia Link - https://en.wikipedia.org/wiki/Fast_inverse_square_root */
package com.thealgorithms.maths;
public class FastInverseSqrt {
public static boolean inverseSqrt(float number) {
float x = number;
float xhalf = 0.5f * x;
int i = Float.floatToIntBits(x);
i = 0x5f3759df - (i >> 1);
x = Float.intBitsToFloat(i);
x = x * (1.5f - xhalf * x * x);
return x == (float)((float)1/(float)Math.sqrt(number));
}
/**
* Returns the inverse square root of the given number upto 6 - 8 decimal places.
* calculates the inverse square root of the given number and returns true if calculated answer matches with given answer else returns false
*/
public static boolean inverseSqrt(double number) {
double x = number;
double xhalf = 0.5d * x;
long i = Double.doubleToLongBits(x);
i = 0x5fe6ec85e7de30daL - (i >> 1);
x = Double.longBitsToDouble(i);
for (int it = 0; it < 4; it++) {
x = x * (1.5d - xhalf * x * x);
}
x *= number;
return x == 1/Math.sqrt(number);
}
/**
* Returns the inverse square root of the given number upto 14 - 16 decimal places.
* calculates the inverse square root of the given number and returns true if calculated answer matches with given answer else returns false
*/
}
/**
* OUTPUT :
* Input - number = 4522
* Output: it calculates the inverse squareroot of a number and returns true with it matches the given answer else returns false.
* 1st approach Time Complexity : O(1)
* Auxiliary Space Complexity : O(1)
* Input - number = 4522
* Output: it calculates the inverse squareroot of a number and returns true with it matches the given answer else returns false.
* 2nd approach Time Complexity : O(1)
* Auxiliary Space Complexity : O(1)
*/

View File

@ -0,0 +1,56 @@
package com.thealgorithms.maths;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
public class FastInverseSqrtTests {
@Test
void testForOneElement()
{
assertFalse(FastInverseSqrt.inverseSqrt(1332));
// calls for the 2nd inverse method
}
@Test
void testForsecond()
{
assertFalse(FastInverseSqrt.inverseSqrt(1332f));
// calls for the 1st inverse method
}
@Test
void testForThird()
{
assertFalse(FastInverseSqrt.inverseSqrt(1));
}
@Test
void testForFourth()
{
assertFalse(FastInverseSqrt.inverseSqrt(1f));
}
@Test
void testForFifth()
{
assertFalse(FastInverseSqrt.inverseSqrt(4522));
}
@Test
void testForSixth()
{
assertFalse(FastInverseSqrt.inverseSqrt(4522f));
}
@Test
void testForSeventh()
{
assertFalse(FastInverseSqrt.inverseSqrt(21));
}
@Test
void testForEighth()
{
assertFalse(FastInverseSqrt.inverseSqrt(21f));
}
}