This is kind of obscure, but I need a function that can be computed very quickly and resembles a^b where a is between 0 and 1 and b is very large. It will be calculated for one a at a time for many b's. Ideally, the result would be within 0.4%. Thanks in advance.
相关问题
- Delete Messages from a Topic in Apache Kafka
- Jackson Deserialization not calling deserialize on
- How to maintain order of key-value in DataFrame sa
- StackExchange API - Deserialize Date in JSON Respo
- Difference between Types.INTEGER and Types.NULL in
Pulling my comments into an answer:
Since you mention that
b
is large enough to be rounded to an integer, then one approach is to use the Binary Exponentiation algorithm by squaring.Math.pow()
is slow because it needs to handle non-integral powers. So might be possible to do better in your case because you can utilize the integer powering algorithms.As always, benchmark your implementation to see if it actually is faster than
Math.pow()
.Here's an implementation that the OP found:
Here's my quick-and-dirty (unoptimized) implementation:
This should work on all positive
pow
. But I haven't benchmarked it againstMath.pow()
.For your specific case ("calculated for one a at a time for many b's") I would suggest following approach:
Prepare table data to be used later in particular calculations:
determine N such that 2^N is less than b for each possible b.
calculate table t: t[n]=a^(2^n) for each n which is less than N. This is effectively done as t[k+1]=t[k]*t[k].
Calculate a^b:
The idea is to reuse values of a^(2^n) for different b's.
Apache FastMath offers
double pow(double d, int e)
function for case when the exponent is an integer.The implementation is based on Veltkamp's TwoProduct algorithm. The usage is similar to standard
Math.pow
function: