The standard Math.sqrt()
method seems pretty fast in Java already, but it has the inherent drawback that it is always going to involve 64-bit operations which does nothing but reduce speed when dealing with 32-bit float
values. Is it possible to do better with a custom method that uses a float
as a parameter, performs 32-bit operations only, and returns a float
as a result?
I saw:
Fast sqrt in Java at the expense of accuracy
and it did little more than reinforce the notion that Math.sqrt() is generally hard-to-beat. I also saw:
http://www.codeproject.com/Articles/69941/Best-Square-Root-Method-Algorithm-Function-Precisi
which showed me a bunch of interesting C++/ASM hacks that I am simply too ignorant to port directly to Java. Though sqrt14 might be interesting as a part of a JNI call . . .
I also looked at Apache Commons FastMath, but it looks like that library defaults to the standard Math.sqrt() so no help there. And then there's Yeppp!:
http://www.yeppp.info/
but I haven't bothered with that yet.
Math. sqrt() returns the square root of a value of type double passed to it as argument. If the argument is NaN or negative, then the result is NaN. If the argument is positive infinity, then the result is positive infinity.
Time Complexity: O(√ n).
1) Java: Square a number by multiplying it by itself int i = 2; int square = i * i; In this example if you print the value of square , it will be 4.
You need nothing to speed up sqrt
for 32-bit values. HotSpot JVM does it automatically for you.
JIT compiler is smart enough to recognize f2d -> Math.sqrt() -> d2f
pattern and replace it with faster sqrtss
CPU instruction instead of sqrtsd
. The source.
The benchmark:
@State(Scope.Benchmark)
public class Sqrt {
double d = Math.random();
float f = (float) d;
@Benchmark
public double sqrtD() {
return Math.sqrt(d);
}
@Benchmark
public float sqrtF() {
return (float) Math.sqrt(f);
}
}
And the results:
Benchmark Mode Cnt Score Error Units
Sqrt.sqrtD thrpt 5 145501,072 ± 2211,666 ops/ms
Sqrt.sqrtF thrpt 5 223657,110 ± 2268,735 ops/ms
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With