Class FastMath
- java.lang.Object
-
- org.hipparchus.util.FastMath
-
public class FastMath extends Object
Faster, more accurate, portable alternative toMath
andStrictMath
for large scale computation.FastMath is a drop-in replacement for both Math and StrictMath. This means that for any method in Math (say
Math.sin(x)
orMath.cbrt(y)
), user can directly change the class and use the methods as is (usingFastMath.sin(x)
orFastMath.cbrt(y)
in the previous example).FastMath speed is achieved by relying heavily on optimizing compilers to native code present in many JVMs today and use of large tables. The larger tables are lazily initialized on first use, so that the setup time does not penalize methods that don't need them.
Note that FastMath is extensively used inside Hipparchus, so by calling some algorithms, the overhead when the the tables need to be initialized will occur regardless of the end-user calling FastMath methods directly or not. Performance figures for a specific JVM and hardware can be evaluated by running the FastMathTestPerformance tests in the test directory of the source distribution.
FastMath accuracy should be mostly independent of the JVM as it relies only on IEEE-754 basic operations and on embedded tables. Almost all operations are accurate to about 0.5 ulp throughout the domain range. This statement, of course is only a rough global observed behavior, it is not a guarantee for every double numbers input (see William Kahan's Table Maker's Dilemma).
FastMath additionally implements the following methods not found in Math/StrictMath:
The following methods are found in Math/StrictMath since 1.6 only, they are provided by FastMath even in 1.5 Java virtual machines
-
-
Method Summary
All Methods Static Methods Concrete Methods Modifier and Type Method Description static double
abs(double x)
Absolute value.static float
abs(float x)
Absolute value.static int
abs(int x)
Absolute value.static long
abs(long x)
Absolute value.static <T extends RealFieldElement<T>>
Tabs(T x)
Absolute value.static double
acos(double x)
Compute the arc cosine of a number.static <T extends RealFieldElement<T>>
Tacos(T x)
Compute the arc cosine of a number.static double
acosh(double a)
Compute the inverse hyperbolic cosine of a number.static <T extends RealFieldElement<T>>
Tacosh(T a)
Compute the inverse hyperbolic cosine of a number.static int
addExact(int a, int b)
Add two numbers, detecting overflows.static long
addExact(long a, long b)
Add two numbers, detecting overflows.static double
asin(double x)
Compute the arc sine of a number.static <T extends RealFieldElement<T>>
Tasin(T x)
Compute the arc sine of a number.static double
asinh(double a)
Compute the inverse hyperbolic sine of a number.static <T extends RealFieldElement<T>>
Tasinh(T a)
Compute the inverse hyperbolic sine of a number.static double
atan(double x)
Arctangent functionstatic <T extends RealFieldElement<T>>
Tatan(T x)
Arctangent functionstatic double
atan2(double y, double x)
Two arguments arctangent functionstatic <T extends RealFieldElement<T>>
Tatan2(T y, T x)
Two arguments arctangent functionstatic double
atanh(double a)
Compute the inverse hyperbolic tangent of a number.static <T extends RealFieldElement<T>>
Tatanh(T a)
Compute the inverse hyperbolic tangent of a number.static double
cbrt(double x)
Compute the cubic root of a number.static <T extends RealFieldElement<T>>
Tcbrt(T x)
Compute the cubic root of a number.static double
ceil(double x)
Get the smallest whole number larger than x.static <T extends RealFieldElement<T>>
Tceil(T x)
Get the smallest whole number larger than x.static double
copySign(double magnitude, double sign)
Returns the first argument with the sign of the second argument.static float
copySign(float magnitude, float sign)
Returns the first argument with the sign of the second argument.static <T extends RealFieldElement<T>>
TcopySign(T magnitude, double sign)
Returns the first argument with the sign of the second argument.static <T extends RealFieldElement<T>>
TcopySign(T magnitude, T sign)
Returns the first argument with the sign of the second argument.static double
cos(double x)
Cosine function.static <T extends RealFieldElement<T>>
Tcos(T x)
Cosine function.static double
cosh(double x)
Compute the hyperbolic cosine of a number.static <T extends RealFieldElement<T>>
Tcosh(T x)
Compute the hyperbolic cosine of a number.static int
decrementExact(int n)
Decrement a number, detecting overflows.static long
decrementExact(long n)
Decrement a number, detecting overflows.static double
exp(double x)
Exponential function.static <T extends RealFieldElement<T>>
Texp(T x)
Exponential function.static double
expm1(double x)
Compute exp(x) - 1static <T extends RealFieldElement<T>>
Texpm1(T x)
Compute exp(x) - 1static double
floor(double x)
Get the largest whole number smaller than x.static <T extends RealFieldElement<T>>
Tfloor(T x)
Get the largest whole number smaller than x.static int
floorDiv(int a, int b)
Finds q such thata = q b + r
with0 <= r < b
ifb > 0
andb < r <= 0
ifb < 0
.static long
floorDiv(long a, int b)
Finds q such thata = q b + r
with0 <= r < b
ifb > 0
andb < r <= 0
ifb < 0
.static long
floorDiv(long a, long b)
Finds q such thata = q b + r
with0 <= r < b
ifb > 0
andb < r <= 0
ifb < 0
.static int
floorMod(int a, int b)
Finds r such thata = q b + r
with0 <= r < b
ifb > 0
andb < r <= 0
ifb < 0
.static int
floorMod(long a, int b)
Finds r such thata = q b + r
with0 <= r < b
ifb > 0
andb < r <= 0
ifb < 0
.static long
floorMod(long a, long b)
Finds r such thata = q b + r
with0 <= r < b
ifb > 0
andb < r <= 0
ifb < 0
.static double
fma(double a, double b, double c)
Compute Fused-multiply-add operation a * b + c.static float
fma(float a, float b, float c)
Compute Fused-multiply-add operation a * b + c.static int
getExponent(double d)
Return the exponent of a double number, removing the bias.static int
getExponent(float f)
Return the exponent of a float number, removing the bias.static double
hypot(double x, double y)
Returns the hypotenuse of a triangle with sidesx
andy
- sqrt(x2 +y2)
avoiding intermediate overflow or underflow.static <T extends RealFieldElement<T>>
Thypot(T x, T y)
Returns the hypotenuse of a triangle with sidesx
andy
- sqrt(x2 +y2)
avoiding intermediate overflow or underflow.static double
IEEEremainder(double dividend, double divisor)
Computes the remainder as prescribed by the IEEE 754 standard.static <T extends RealFieldElement<T>>
TIEEEremainder(T dividend, double divisor)
Computes the remainder as prescribed by the IEEE 754 standard.static <T extends RealFieldElement<T>>
TIEEEremainder(T dividend, T divisor)
Computes the remainder as prescribed by the IEEE 754 standard.static int
incrementExact(int n)
Increment a number, detecting overflows.static long
incrementExact(long n)
Increment a number, detecting overflows.static double
log(double x)
Natural logarithm.static double
log(double base, double x)
Computes the logarithm in a given base.static <T extends RealFieldElement<T>>
Tlog(T x)
Natural logarithm.static double
log10(double x)
Compute the base 10 logarithm.static <T extends RealFieldElement<T>>
Tlog10(T x)
Compute the base 10 logarithm.static double
log1p(double x)
Computes log(1 + x).static <T extends RealFieldElement<T>>
Tlog1p(T x)
Computes log(1 + x).static void
main(String[] a)
Print out contents of arrays, and check the length.static double
max(double a, double b)
Compute the maximum of two valuesstatic float
max(float a, float b)
Compute the maximum of two valuesstatic int
max(int a, int b)
Compute the maximum of two valuesstatic long
max(long a, long b)
Compute the maximum of two valuesstatic <T extends RealFieldElement<T>>
Tmax(T a, T b)
Compute the maximum of two valuesstatic double
min(double a, double b)
Compute the minimum of two valuesstatic float
min(float a, float b)
Compute the minimum of two valuesstatic int
min(int a, int b)
Compute the minimum of two valuesstatic long
min(long a, long b)
Compute the minimum of two valuesstatic <T extends RealFieldElement<T>>
Tmin(T a, T b)
Compute the minimum of two valuesstatic int
multiplyExact(int a, int b)
Multiply two numbers, detecting overflows.static long
multiplyExact(long a, int b)
Multiply two numbers, detecting overflows.static long
multiplyExact(long a, long b)
Multiply two numbers, detecting overflows.static long
multiplyFull(int a, int b)
Multiply two integers and give an exact result without overflow.static long
multiplyHigh(long a, long b)
Multiply two long integers and give the 64 most significant bits of the result.static double
nextAfter(double d, double direction)
Get the next machine representable number after a number, moving in the direction of another number.static float
nextAfter(float f, double direction)
Get the next machine representable number after a number, moving in the direction of another number.static double
nextDown(double a)
Compute next number towards negative infinity.static float
nextDown(float a)
Compute next number towards negative infinity.static double
nextUp(double a)
Compute next number towards positive infinity.static float
nextUp(float a)
Compute next number towards positive infinity.static double
pow(double x, double y)
Power function.static double
pow(double d, int e)
Raise a double to an int power.static double
pow(double d, long e)
Raise a double to a long power.static <T extends RealFieldElement<T>>
Tpow(T d, int e)
Raise a double to an int power.static <T extends RealFieldElement<T>>
Tpow(T x, T y)
Power function.static double
random()
Returns a pseudo-random number between 0.0 and 1.0.static double
rint(double x)
Get the whole number that is the nearest to x, or the even one if x is exactly half way between two integers.static <T extends RealFieldElement<T>>
Trint(T x)
Get the whole number that is the nearest to x, or the even one if x is exactly half way between two integers.static long
round(double x)
Get the closest long to x.static int
round(float x)
Get the closest int to x.static <T extends RealFieldElement<T>>
longround(T x)
Get the closest long to x.static double
scalb(double d, int n)
Multiply a double number by a power of 2.static float
scalb(float f, int n)
Multiply a float number by a power of 2.static <T extends RealFieldElement<T>>
Tscalb(T d, int n)
Multiply a double number by a power of 2.static double
signum(double a)
Compute the signum of a number.static float
signum(float a)
Compute the signum of a number.static <T extends RealFieldElement<T>>
Tsignum(T a)
Compute the signum of a number.static double
sin(double x)
Sine function.static <T extends RealFieldElement<T>>
Tsin(T x)
Sine function.static SinCos
sinCos(double x)
Combined Sine and Cosine function.static <T extends RealFieldElement<T>>
FieldSinCos<T>sinCos(T x)
Combined Sine and Cosine function.static double
sinh(double x)
Compute the hyperbolic sine of a number.static <T extends RealFieldElement<T>>
Tsinh(T x)
Compute the hyperbolic sine of a number.static double
sqrt(double a)
Compute the square root of a number.static <T extends RealFieldElement<T>>
Tsqrt(T a)
Compute the square root of a number.static int
subtractExact(int a, int b)
Subtract two numbers, detecting overflows.static long
subtractExact(long a, long b)
Subtract two numbers, detecting overflows.static double
tan(double x)
Tangent function.static <T extends RealFieldElement<T>>
Ttan(T x)
Tangent function.static double
tanh(double x)
Compute the hyperbolic tangent of a number.static <T extends RealFieldElement<T>>
Ttanh(T x)
Compute the hyperbolic tangent of a number.static double
toDegrees(double x)
Convert radians to degrees, with error of less than 0.5 ULPstatic int
toIntExact(long n)
Convert a long to interger, detecting overflowsstatic double
toRadians(double x)
Convert degrees to radians, with error of less than 0.5 ULPstatic double
ulp(double x)
Compute least significant bit (Unit in Last Position) for a number.static float
ulp(float x)
Compute least significant bit (Unit in Last Position) for a number.
-
-
-
Field Detail
-
PI
public static final double PI
Archimede's constant PI, ratio of circle circumference to diameter.- See Also:
- Constant Field Values
-
E
public static final double E
Napier's constant e, base of the natural logarithm.- See Also:
- Constant Field Values
-
-
Method Detail
-
sqrt
public static double sqrt(double a)
Compute the square root of a number.Note: this implementation currently delegates to
Math.sqrt(double)
- Parameters:
a
- number on which evaluation is done- Returns:
- square root of a
-
cosh
public static double cosh(double x)
Compute the hyperbolic cosine of a number.- Parameters:
x
- number on which evaluation is done- Returns:
- hyperbolic cosine of x
-
sinh
public static double sinh(double x)
Compute the hyperbolic sine of a number.- Parameters:
x
- number on which evaluation is done- Returns:
- hyperbolic sine of x
-
tanh
public static double tanh(double x)
Compute the hyperbolic tangent of a number.- Parameters:
x
- number on which evaluation is done- Returns:
- hyperbolic tangent of x
-
acosh
public static double acosh(double a)
Compute the inverse hyperbolic cosine of a number.- Parameters:
a
- number on which evaluation is done- Returns:
- inverse hyperbolic cosine of a
-
asinh
public static double asinh(double a)
Compute the inverse hyperbolic sine of a number.- Parameters:
a
- number on which evaluation is done- Returns:
- inverse hyperbolic sine of a
-
atanh
public static double atanh(double a)
Compute the inverse hyperbolic tangent of a number.- Parameters:
a
- number on which evaluation is done- Returns:
- inverse hyperbolic tangent of a
-
signum
public static double signum(double a)
Compute the signum of a number. The signum is -1 for negative numbers, +1 for positive numbers and 0 otherwise- Parameters:
a
- number on which evaluation is done- Returns:
- -1.0, -0.0, +0.0, +1.0 or NaN depending on sign of a
-
signum
public static float signum(float a)
Compute the signum of a number. The signum is -1 for negative numbers, +1 for positive numbers and 0 otherwise- Parameters:
a
- number on which evaluation is done- Returns:
- -1.0, -0.0, +0.0, +1.0 or NaN depending on sign of a
-
nextUp
public static double nextUp(double a)
Compute next number towards positive infinity.- Parameters:
a
- number to which neighbor should be computed- Returns:
- neighbor of a towards positive infinity
-
nextUp
public static float nextUp(float a)
Compute next number towards positive infinity.- Parameters:
a
- number to which neighbor should be computed- Returns:
- neighbor of a towards positive infinity
-
nextDown
public static double nextDown(double a)
Compute next number towards negative infinity.- Parameters:
a
- number to which neighbor should be computed- Returns:
- neighbor of a towards negative infinity
-
nextDown
public static float nextDown(float a)
Compute next number towards negative infinity.- Parameters:
a
- number to which neighbor should be computed- Returns:
- neighbor of a towards negative infinity
-
random
public static double random()
Returns a pseudo-random number between 0.0 and 1.0.Note: this implementation currently delegates to
Math.random()
- Returns:
- a random number between 0.0 and 1.0
-
exp
public static double exp(double x)
Exponential function. Computes exp(x), function result is nearly rounded. It will be correctly rounded to the theoretical value for 99.9% of input values, otherwise it will have a 1 ULP error. Method: Lookup intVal = exp(int(x)) Lookup fracVal = exp(int(x-int(x) / 1024.0) * 1024.0 ); Compute z as the exponential of the remaining bits by a polynomial minus one exp(x) = intVal * fracVal * (1 + z) Accuracy: Calculation is done with 63 bits of precision, so result should be correctly rounded for 99.9% of input values, with less than 1 ULP error otherwise.- Parameters:
x
- a double- Returns:
- double ex
-
expm1
public static double expm1(double x)
Compute exp(x) - 1- Parameters:
x
- number to compute shifted exponential- Returns:
- exp(x) - 1
-
log
public static double log(double x)
Natural logarithm.- Parameters:
x
- a double- Returns:
- log(x)
-
log1p
public static double log1p(double x)
Computes log(1 + x).- Parameters:
x
- Number.- Returns:
log(1 + x)
.
-
log10
public static double log10(double x)
Compute the base 10 logarithm.- Parameters:
x
- a number- Returns:
- log10(x)
-
log
public static double log(double base, double x)
Computes the logarithm in a given base. ReturnsNaN
if either argument is negative. Ifbase
is 0 andx
is positive, 0 is returned. Ifbase
is positive andx
is 0,Double.NEGATIVE_INFINITY
is returned. If both arguments are 0, the result isNaN
.- Parameters:
base
- Base of the logarithm, must be greater than 0.x
- Argument, must be greater than 0.- Returns:
- the value of the logarithm, i.e. the number
y
such thatbasey = x
.
-
pow
public static double pow(double x, double y)
Power function. Compute x^y.- Parameters:
x
- a doubley
- a double- Returns:
- double
-
pow
public static double pow(double d, int e)
Raise a double to an int power.- Parameters:
d
- Number to raise.e
- Exponent.- Returns:
- de
-
pow
public static double pow(double d, long e)
Raise a double to a long power.- Parameters:
d
- Number to raise.e
- Exponent.- Returns:
- de
-
sin
public static double sin(double x)
Sine function.- Parameters:
x
- Argument.- Returns:
- sin(x)
-
cos
public static double cos(double x)
Cosine function.- Parameters:
x
- Argument.- Returns:
- cos(x)
-
sinCos
public static SinCos sinCos(double x)
Combined Sine and Cosine function.- Parameters:
x
- Argument.- Returns:
- [sin(x), cos(x)]
-
sinCos
public static <T extends RealFieldElement<T>> FieldSinCos<T> sinCos(T x)
Combined Sine and Cosine function.- Type Parameters:
T
- the type of the field element- Parameters:
x
- Argument.- Returns:
- [sin(x), cos(x)]
- Since:
- 1.4
-
tan
public static double tan(double x)
Tangent function.- Parameters:
x
- Argument.- Returns:
- tan(x)
-
atan
public static double atan(double x)
Arctangent function- Parameters:
x
- a number- Returns:
- atan(x)
-
atan2
public static double atan2(double y, double x)
Two arguments arctangent function- Parameters:
y
- ordinatex
- abscissa- Returns:
- phase angle of point (x,y) between
-PI
andPI
-
asin
public static double asin(double x)
Compute the arc sine of a number.- Parameters:
x
- number on which evaluation is done- Returns:
- arc sine of x
-
acos
public static double acos(double x)
Compute the arc cosine of a number.- Parameters:
x
- number on which evaluation is done- Returns:
- arc cosine of x
-
cbrt
public static double cbrt(double x)
Compute the cubic root of a number.- Parameters:
x
- number on which evaluation is done- Returns:
- cubic root of x
-
toRadians
public static double toRadians(double x)
Convert degrees to radians, with error of less than 0.5 ULP- Parameters:
x
- angle in degrees- Returns:
- x converted into radians
-
toDegrees
public static double toDegrees(double x)
Convert radians to degrees, with error of less than 0.5 ULP- Parameters:
x
- angle in radians- Returns:
- x converted into degrees
-
abs
public static int abs(int x)
Absolute value.- Parameters:
x
- number from which absolute value is requested- Returns:
- abs(x)
-
abs
public static long abs(long x)
Absolute value.- Parameters:
x
- number from which absolute value is requested- Returns:
- abs(x)
-
abs
public static float abs(float x)
Absolute value.- Parameters:
x
- number from which absolute value is requested- Returns:
- abs(x)
-
abs
public static double abs(double x)
Absolute value.- Parameters:
x
- number from which absolute value is requested- Returns:
- abs(x)
-
ulp
public static double ulp(double x)
Compute least significant bit (Unit in Last Position) for a number.- Parameters:
x
- number from which ulp is requested- Returns:
- ulp(x)
-
ulp
public static float ulp(float x)
Compute least significant bit (Unit in Last Position) for a number.- Parameters:
x
- number from which ulp is requested- Returns:
- ulp(x)
-
scalb
public static double scalb(double d, int n)
Multiply a double number by a power of 2.- Parameters:
d
- number to multiplyn
- power of 2- Returns:
- d × 2n
-
scalb
public static float scalb(float f, int n)
Multiply a float number by a power of 2.- Parameters:
f
- number to multiplyn
- power of 2- Returns:
- f × 2n
-
nextAfter
public static double nextAfter(double d, double direction)
Get the next machine representable number after a number, moving in the direction of another number.The ordering is as follows (increasing):
- -INFINITY
- -MAX_VALUE
- -MIN_VALUE
- -0.0
- +0.0
- +MIN_VALUE
- +MAX_VALUE
- +INFINITY
If arguments compare equal, then the second argument is returned.
If
direction
is greater thand
, the smallest machine representable number strictly greater thand
is returned; if less, then the largest representable number strictly less thand
is returned.If
d
is infinite and direction does not bring it back to finite numbers, it is returned unchanged.- Parameters:
d
- base numberdirection
- (the only important thing is whetherdirection
is greater or smaller thand
)- Returns:
- the next machine representable number in the specified direction
-
nextAfter
public static float nextAfter(float f, double direction)
Get the next machine representable number after a number, moving in the direction of another number.The ordering is as follows (increasing):
- -INFINITY
- -MAX_VALUE
- -MIN_VALUE
- -0.0
- +0.0
- +MIN_VALUE
- +MAX_VALUE
- +INFINITY
If arguments compare equal, then the second argument is returned.
If
direction
is greater thanf
, the smallest machine representable number strictly greater thanf
is returned; if less, then the largest representable number strictly less thanf
is returned.If
f
is infinite and direction does not bring it back to finite numbers, it is returned unchanged.- Parameters:
f
- base numberdirection
- (the only important thing is whetherdirection
is greater or smaller thanf
)- Returns:
- the next machine representable number in the specified direction
-
floor
public static double floor(double x)
Get the largest whole number smaller than x.- Parameters:
x
- number from which floor is requested- Returns:
- a double number f such that f is an integer f <= x < f + 1.0
-
ceil
public static double ceil(double x)
Get the smallest whole number larger than x.- Parameters:
x
- number from which ceil is requested- Returns:
- a double number c such that c is an integer c - 1.0 < x <= c
-
rint
public static double rint(double x)
Get the whole number that is the nearest to x, or the even one if x is exactly half way between two integers.- Parameters:
x
- number from which nearest whole number is requested- Returns:
- a double number r such that r is an integer r - 0.5 <= x <= r + 0.5
-
round
public static long round(double x)
Get the closest long to x.- Parameters:
x
- number from which closest long is requested- Returns:
- closest long to x
-
round
public static int round(float x)
Get the closest int to x.- Parameters:
x
- number from which closest int is requested- Returns:
- closest int to x
-
min
public static int min(int a, int b)
Compute the minimum of two values- Parameters:
a
- first valueb
- second value- Returns:
- a if a is lesser or equal to b, b otherwise
-
min
public static long min(long a, long b)
Compute the minimum of two values- Parameters:
a
- first valueb
- second value- Returns:
- a if a is lesser or equal to b, b otherwise
-
min
public static float min(float a, float b)
Compute the minimum of two values- Parameters:
a
- first valueb
- second value- Returns:
- a if a is lesser or equal to b, b otherwise
-
min
public static double min(double a, double b)
Compute the minimum of two values- Parameters:
a
- first valueb
- second value- Returns:
- a if a is lesser or equal to b, b otherwise
-
max
public static int max(int a, int b)
Compute the maximum of two values- Parameters:
a
- first valueb
- second value- Returns:
- b if a is lesser or equal to b, a otherwise
-
max
public static long max(long a, long b)
Compute the maximum of two values- Parameters:
a
- first valueb
- second value- Returns:
- b if a is lesser or equal to b, a otherwise
-
max
public static float max(float a, float b)
Compute the maximum of two values- Parameters:
a
- first valueb
- second value- Returns:
- b if a is lesser or equal to b, a otherwise
-
max
public static double max(double a, double b)
Compute the maximum of two values- Parameters:
a
- first valueb
- second value- Returns:
- b if a is lesser or equal to b, a otherwise
-
hypot
public static double hypot(double x, double y)
Returns the hypotenuse of a triangle with sidesx
andy
- sqrt(x2 +y2)
avoiding intermediate overflow or underflow.- If either argument is infinite, then the result is positive infinity.
- else, if either argument is NaN then the result is NaN.
- Parameters:
x
- a valuey
- a value- Returns:
- sqrt(x2 +y2)
-
IEEEremainder
public static double IEEEremainder(double dividend, double divisor)
Computes the remainder as prescribed by the IEEE 754 standard. The remainder value is mathematically equal tox - y*n
wheren
is the mathematical integer closest to the exact mathematical value of the quotientx/y
. If two mathematical integers are equally close tox/y
thenn
is the integer that is even.- If either operand is NaN, the result is NaN.
- If the result is not NaN, the sign of the result equals the sign of the dividend.
- If the dividend is an infinity, or the divisor is a zero, or both, the result is NaN.
- If the dividend is finite and the divisor is an infinity, the result equals the dividend.
- If the dividend is a zero and the divisor is finite, the result equals the dividend.
- Parameters:
dividend
- the number to be divideddivisor
- the number by which to divide- Returns:
- the remainder, rounded
-
toIntExact
public static int toIntExact(long n) throws MathRuntimeException
Convert a long to interger, detecting overflows- Parameters:
n
- number to convert to int- Returns:
- integer with same valie as n if no overflows occur
- Throws:
MathRuntimeException
- if n cannot fit into an int
-
incrementExact
public static int incrementExact(int n) throws MathRuntimeException
Increment a number, detecting overflows.- Parameters:
n
- number to increment- Returns:
- n+1 if no overflows occur
- Throws:
MathRuntimeException
- if an overflow occurs
-
incrementExact
public static long incrementExact(long n) throws MathRuntimeException
Increment a number, detecting overflows.- Parameters:
n
- number to increment- Returns:
- n+1 if no overflows occur
- Throws:
MathRuntimeException
- if an overflow occurs
-
decrementExact
public static int decrementExact(int n) throws MathRuntimeException
Decrement a number, detecting overflows.- Parameters:
n
- number to decrement- Returns:
- n-1 if no overflows occur
- Throws:
MathRuntimeException
- if an overflow occurs
-
decrementExact
public static long decrementExact(long n) throws MathRuntimeException
Decrement a number, detecting overflows.- Parameters:
n
- number to decrement- Returns:
- n-1 if no overflows occur
- Throws:
MathRuntimeException
- if an overflow occurs
-
addExact
public static int addExact(int a, int b) throws MathRuntimeException
Add two numbers, detecting overflows.- Parameters:
a
- first number to addb
- second number to add- Returns:
- a+b if no overflows occur
- Throws:
MathRuntimeException
- if an overflow occurs
-
addExact
public static long addExact(long a, long b) throws MathRuntimeException
Add two numbers, detecting overflows.- Parameters:
a
- first number to addb
- second number to add- Returns:
- a+b if no overflows occur
- Throws:
MathRuntimeException
- if an overflow occurs
-
subtractExact
public static int subtractExact(int a, int b)
Subtract two numbers, detecting overflows.- Parameters:
a
- first numberb
- second number to subtract from a- Returns:
- a-b if no overflows occur
- Throws:
MathRuntimeException
- if an overflow occurs
-
subtractExact
public static long subtractExact(long a, long b)
Subtract two numbers, detecting overflows.- Parameters:
a
- first numberb
- second number to subtract from a- Returns:
- a-b if no overflows occur
- Throws:
MathRuntimeException
- if an overflow occurs
-
multiplyExact
public static int multiplyExact(int a, int b)
Multiply two numbers, detecting overflows.- Parameters:
a
- first number to multiplyb
- second number to multiply- Returns:
- a*b if no overflows occur
- Throws:
MathRuntimeException
- if an overflow occurs
-
multiplyExact
public static long multiplyExact(long a, int b)
Multiply two numbers, detecting overflows.- Parameters:
a
- first number to multiplyb
- second number to multiply- Returns:
- a*b if no overflows occur
- Throws:
MathRuntimeException
- if an overflow occurs- Since:
- 1.3
-
multiplyExact
public static long multiplyExact(long a, long b)
Multiply two numbers, detecting overflows.- Parameters:
a
- first number to multiplyb
- second number to multiply- Returns:
- a*b if no overflows occur
- Throws:
MathRuntimeException
- if an overflow occurs
-
multiplyFull
public static long multiplyFull(int a, int b)
Multiply two integers and give an exact result without overflow.- Parameters:
a
- first factorb
- second factor- Returns:
- a * b exactly
- Since:
- 1.3
-
multiplyHigh
public static long multiplyHigh(long a, long b)
Multiply two long integers and give the 64 most significant bits of the result.Beware that as Java primitive long are always considered to be signed, there are some intermediate values
a
andb
for whicha * b
exceedsLong.MAX_VALUE
but this method will still return 0l. This happens for example fora = 2³¹
andb = 2³²
asa * b = 2⁶³ = Long.MAX_VALUE + 1
, so it exceeds the max value for a long, but still fits in 64 bits, so this method correctly returns 0l in this case, but multiplication result would be considered negative (and in fact equal toLong.MIN_VALUE
- Parameters:
a
- first factorb
- second factor- Returns:
- a * b / 264
- Since:
- 1.3
-
floorDiv
public static int floorDiv(int a, int b) throws MathRuntimeException
Finds q such thata = q b + r
with0 <= r < b
ifb > 0
andb < r <= 0
ifb < 0
.This methods returns the same value as integer division when a and b are same signs, but returns a different value when they are opposite (i.e. q is negative).
- Parameters:
a
- dividendb
- divisor- Returns:
- q such that
a = q b + r
with0 <= r < b
ifb > 0
andb < r <= 0
ifb < 0
- Throws:
MathRuntimeException
- if b == 0- See Also:
floorMod(int, int)
-
floorDiv
public static long floorDiv(long a, int b) throws MathRuntimeException
Finds q such thata = q b + r
with0 <= r < b
ifb > 0
andb < r <= 0
ifb < 0
.This methods returns the same value as integer division when a and b are same signs, but returns a different value when they are opposite (i.e. q is negative).
- Parameters:
a
- dividendb
- divisor- Returns:
- q such that
a = q b + r
with0 <= r < b
ifb > 0
andb < r <= 0
ifb < 0
- Throws:
MathRuntimeException
- if b == 0- Since:
- 1.3
- See Also:
floorMod(long, int)
-
floorDiv
public static long floorDiv(long a, long b) throws MathRuntimeException
Finds q such thata = q b + r
with0 <= r < b
ifb > 0
andb < r <= 0
ifb < 0
.This methods returns the same value as integer division when a and b are same signs, but returns a different value when they are opposite (i.e. q is negative).
- Parameters:
a
- dividendb
- divisor- Returns:
- q such that
a = q b + r
with0 <= r < b
ifb > 0
andb < r <= 0
ifb < 0
- Throws:
MathRuntimeException
- if b == 0- See Also:
floorMod(long, long)
-
floorMod
public static int floorMod(int a, int b) throws MathRuntimeException
Finds r such thata = q b + r
with0 <= r < b
ifb > 0
andb < r <= 0
ifb < 0
.This methods returns the same value as integer modulo when a and b are same signs, but returns a different value when they are opposite (i.e. q is negative).
- Parameters:
a
- dividendb
- divisor- Returns:
- r such that
a = q b + r
with0 <= r < b
ifb > 0
andb < r <= 0
ifb < 0
- Throws:
MathRuntimeException
- if b == 0- See Also:
floorDiv(int, int)
-
floorMod
public static int floorMod(long a, int b)
Finds r such thata = q b + r
with0 <= r < b
ifb > 0
andb < r <= 0
ifb < 0
.This methods returns the same value as integer modulo when a and b are same signs, but returns a different value when they are opposite (i.e. q is negative).
- Parameters:
a
- dividendb
- divisor- Returns:
- r such that
a = q b + r
with0 <= r < b
ifb > 0
andb < r <= 0
ifb < 0
- Throws:
MathRuntimeException
- if b == 0- Since:
- 1.3
- See Also:
floorDiv(long, int)
-
floorMod
public static long floorMod(long a, long b)
Finds r such thata = q b + r
with0 <= r < b
ifb > 0
andb < r <= 0
ifb < 0
.This methods returns the same value as integer modulo when a and b are same signs, but returns a different value when they are opposite (i.e. q is negative).
- Parameters:
a
- dividendb
- divisor- Returns:
- r such that
a = q b + r
with0 <= r < b
ifb > 0
andb < r <= 0
ifb < 0
- Throws:
MathRuntimeException
- if b == 0- See Also:
floorDiv(long, long)
-
copySign
public static double copySign(double magnitude, double sign)
Returns the first argument with the sign of the second argument. A NaNsign
argument is treated as positive.- Parameters:
magnitude
- the value to returnsign
- the sign for the returned value- Returns:
- the magnitude with the same sign as the
sign
argument
-
copySign
public static float copySign(float magnitude, float sign)
Returns the first argument with the sign of the second argument. A NaNsign
argument is treated as positive.- Parameters:
magnitude
- the value to returnsign
- the sign for the returned value- Returns:
- the magnitude with the same sign as the
sign
argument
-
getExponent
public static int getExponent(double d)
Return the exponent of a double number, removing the bias.For double numbers of the form 2x, the unbiased exponent is exactly x.
- Parameters:
d
- number from which exponent is requested- Returns:
- exponent for d in IEEE754 representation, without bias
-
getExponent
public static int getExponent(float f)
Return the exponent of a float number, removing the bias.For float numbers of the form 2x, the unbiased exponent is exactly x.
- Parameters:
f
- number from which exponent is requested- Returns:
- exponent for d in IEEE754 representation, without bias
-
fma
public static double fma(double a, double b, double c)
Compute Fused-multiply-add operation a * b + c.This method was introduced in the regular
Math
andStrictMath
methods with Java 9, and then added to Hipparchus for consistency. However, a more general method was available in Hipparchus that also allow to repeat this computation across several terms:MathArrays.linearCombination(double[], double[])
. The linear combination method should probably be preferred in most cases.- Parameters:
a
- first factorb
- second factorc
- additive term- Returns:
- a * b + c, using extended precision in the multiplication
- Since:
- 1.3
- See Also:
MathArrays.linearCombination(double[], double[])
,MathArrays.linearCombination(double, double, double, double)
,MathArrays.linearCombination(double, double, double, double, double, double)
,MathArrays.linearCombination(double, double, double, double, double, double, double, double)
-
fma
public static float fma(float a, float b, float c)
Compute Fused-multiply-add operation a * b + c.This method was introduced in the regular
Math
andStrictMath
methods with Java 9, and then added to Hipparchus for consistency. However, a more general method was available in Hipparchus that also allow to repeat this computation across several terms:MathArrays.linearCombination(double[], double[])
. The linear combination method should probably be preferred in most cases.- Parameters:
a
- first factorb
- second factorc
- additive term- Returns:
- a * b + c, using extended precision in the multiplication
- See Also:
MathArrays.linearCombination(double[], double[])
,MathArrays.linearCombination(double, double, double, double)
,MathArrays.linearCombination(double, double, double, double, double, double)
,MathArrays.linearCombination(double, double, double, double, double, double, double, double)
-
sqrt
public static <T extends RealFieldElement<T>> T sqrt(T a)
Compute the square root of a number.- Type Parameters:
T
- the type of the field element- Parameters:
a
- number on which evaluation is done- Returns:
- square root of a
- Since:
- 1.3
-
cosh
public static <T extends RealFieldElement<T>> T cosh(T x)
Compute the hyperbolic cosine of a number.- Type Parameters:
T
- the type of the field element- Parameters:
x
- number on which evaluation is done- Returns:
- hyperbolic cosine of x
- Since:
- 1.3
-
sinh
public static <T extends RealFieldElement<T>> T sinh(T x)
Compute the hyperbolic sine of a number.- Type Parameters:
T
- the type of the field element- Parameters:
x
- number on which evaluation is done- Returns:
- hyperbolic sine of x
- Since:
- 1.3
-
tanh
public static <T extends RealFieldElement<T>> T tanh(T x)
Compute the hyperbolic tangent of a number.- Type Parameters:
T
- the type of the field element- Parameters:
x
- number on which evaluation is done- Returns:
- hyperbolic tangent of x
- Since:
- 1.3
-
acosh
public static <T extends RealFieldElement<T>> T acosh(T a)
Compute the inverse hyperbolic cosine of a number.- Type Parameters:
T
- the type of the field element- Parameters:
a
- number on which evaluation is done- Returns:
- inverse hyperbolic cosine of a
- Since:
- 1.3
-
asinh
public static <T extends RealFieldElement<T>> T asinh(T a)
Compute the inverse hyperbolic sine of a number.- Type Parameters:
T
- the type of the field element- Parameters:
a
- number on which evaluation is done- Returns:
- inverse hyperbolic sine of a
- Since:
- 1.3
-
atanh
public static <T extends RealFieldElement<T>> T atanh(T a)
Compute the inverse hyperbolic tangent of a number.- Type Parameters:
T
- the type of the field element- Parameters:
a
- number on which evaluation is done- Returns:
- inverse hyperbolic tangent of a
- Since:
- 1.3
-
signum
public static <T extends RealFieldElement<T>> T signum(T a)
Compute the signum of a number. The signum is -1 for negative numbers, +1 for positive numbers and 0 otherwise- Type Parameters:
T
- the type of the field element- Parameters:
a
- number on which evaluation is done- Returns:
- -1.0, -0.0, +0.0, +1.0 or NaN depending on sign of a
- Since:
- 1.3
-
exp
public static <T extends RealFieldElement<T>> T exp(T x)
Exponential function. Computes exp(x), function result is nearly rounded. It will be correctly rounded to the theoretical value for 99.9% of input values, otherwise it will have a 1 ULP error. Method: Lookup intVal = exp(int(x)) Lookup fracVal = exp(int(x-int(x) / 1024.0) * 1024.0 ); Compute z as the exponential of the remaining bits by a polynomial minus one exp(x) = intVal * fracVal * (1 + z) Accuracy: Calculation is done with 63 bits of precision, so result should be correctly rounded for 99.9% of input values, with less than 1 ULP error otherwise.- Type Parameters:
T
- the type of the field element- Parameters:
x
- a double- Returns:
- double ex
- Since:
- 1.3
-
expm1
public static <T extends RealFieldElement<T>> T expm1(T x)
Compute exp(x) - 1- Type Parameters:
T
- the type of the field element- Parameters:
x
- number to compute shifted exponential- Returns:
- exp(x) - 1
- Since:
- 1.3
-
log
public static <T extends RealFieldElement<T>> T log(T x)
Natural logarithm.- Type Parameters:
T
- the type of the field element- Parameters:
x
- a double- Returns:
- log(x)
- Since:
- 1.3
-
log1p
public static <T extends RealFieldElement<T>> T log1p(T x)
Computes log(1 + x).- Type Parameters:
T
- the type of the field element- Parameters:
x
- Number.- Returns:
log(1 + x)
.- Since:
- 1.3
-
log10
public static <T extends RealFieldElement<T>> T log10(T x)
Compute the base 10 logarithm.- Type Parameters:
T
- the type of the field element- Parameters:
x
- a number- Returns:
- log10(x)
- Since:
- 1.3
-
pow
public static <T extends RealFieldElement<T>> T pow(T x, T y)
Power function. Compute xy.- Type Parameters:
T
- the type of the field element- Parameters:
x
- a doubley
- a double- Returns:
- xy
- Since:
- 1.3
-
pow
public static <T extends RealFieldElement<T>> T pow(T d, int e)
Raise a double to an int power.- Type Parameters:
T
- the type of the field element- Parameters:
d
- Number to raise.e
- Exponent.- Returns:
- de
- Since:
- 1.3
-
sin
public static <T extends RealFieldElement<T>> T sin(T x)
Sine function.- Type Parameters:
T
- the type of the field element- Parameters:
x
- Argument.- Returns:
- sin(x)
- Since:
- 1.3
-
cos
public static <T extends RealFieldElement<T>> T cos(T x)
Cosine function.- Type Parameters:
T
- the type of the field element- Parameters:
x
- Argument.- Returns:
- cos(x)
- Since:
- 1.3
-
tan
public static <T extends RealFieldElement<T>> T tan(T x)
Tangent function.- Type Parameters:
T
- the type of the field element- Parameters:
x
- Argument.- Returns:
- tan(x)
- Since:
- 1.3
-
atan
public static <T extends RealFieldElement<T>> T atan(T x)
Arctangent function- Type Parameters:
T
- the type of the field element- Parameters:
x
- a number- Returns:
- atan(x)
- Since:
- 1.3
-
atan2
public static <T extends RealFieldElement<T>> T atan2(T y, T x)
Two arguments arctangent function- Type Parameters:
T
- the type of the field element- Parameters:
y
- ordinatex
- abscissa- Returns:
- phase angle of point (x,y) between
-PI
andPI
- Since:
- 1.3
-
asin
public static <T extends RealFieldElement<T>> T asin(T x)
Compute the arc sine of a number.- Type Parameters:
T
- the type of the field element- Parameters:
x
- number on which evaluation is done- Returns:
- arc sine of x
- Since:
- 1.3
-
acos
public static <T extends RealFieldElement<T>> T acos(T x)
Compute the arc cosine of a number.- Type Parameters:
T
- the type of the field element- Parameters:
x
- number on which evaluation is done- Returns:
- arc cosine of x
- Since:
- 1.3
-
cbrt
public static <T extends RealFieldElement<T>> T cbrt(T x)
Compute the cubic root of a number.- Type Parameters:
T
- the type of the field element- Parameters:
x
- number on which evaluation is done- Returns:
- cubic root of x
- Since:
- 1.3
-
abs
public static <T extends RealFieldElement<T>> T abs(T x)
Absolute value.- Type Parameters:
T
- the type of the field element- Parameters:
x
- number from which absolute value is requested- Returns:
- abs(x)
- Since:
- 1.3
-
scalb
public static <T extends RealFieldElement<T>> T scalb(T d, int n)
Multiply a double number by a power of 2.- Type Parameters:
T
- the type of the field element- Parameters:
d
- number to multiplyn
- power of 2- Returns:
- d × 2n
- Since:
- 1.3
-
floor
public static <T extends RealFieldElement<T>> T floor(T x)
Get the largest whole number smaller than x.- Type Parameters:
T
- the type of the field element- Parameters:
x
- number from which floor is requested- Returns:
- a double number f such that f is an integer f <= x < f + 1.0
- Since:
- 1.3
-
ceil
public static <T extends RealFieldElement<T>> T ceil(T x)
Get the smallest whole number larger than x.- Type Parameters:
T
- the type of the field element- Parameters:
x
- number from which ceil is requested- Returns:
- a double number c such that c is an integer c - 1.0 < x <= c
- Since:
- 1.3
-
rint
public static <T extends RealFieldElement<T>> T rint(T x)
Get the whole number that is the nearest to x, or the even one if x is exactly half way between two integers.- Type Parameters:
T
- the type of the field element- Parameters:
x
- number from which nearest whole number is requested- Returns:
- a double number r such that r is an integer r - 0.5 <= x <= r + 0.5
- Since:
- 1.3
-
round
public static <T extends RealFieldElement<T>> long round(T x)
Get the closest long to x.- Type Parameters:
T
- the type of the field element- Parameters:
x
- number from which closest long is requested- Returns:
- closest long to x
- Since:
- 1.3
-
min
public static <T extends RealFieldElement<T>> T min(T a, T b)
Compute the minimum of two values- Type Parameters:
T
- the type of the field element- Parameters:
a
- first valueb
- second value- Returns:
- a if a is lesser or equal to b, b otherwise
- Since:
- 1.3
-
max
public static <T extends RealFieldElement<T>> T max(T a, T b)
Compute the maximum of two values- Type Parameters:
T
- the type of the field element- Parameters:
a
- first valueb
- second value- Returns:
- b if a is lesser or equal to b, a otherwise
- Since:
- 1.3
-
hypot
public static <T extends RealFieldElement<T>> T hypot(T x, T y)
Returns the hypotenuse of a triangle with sidesx
andy
- sqrt(x2 +y2)
avoiding intermediate overflow or underflow.- If either argument is infinite, then the result is positive infinity.
- else, if either argument is NaN then the result is NaN.
- Type Parameters:
T
- the type of the field element- Parameters:
x
- a valuey
- a value- Returns:
- sqrt(x2 +y2)
- Since:
- 1.3
-
IEEEremainder
public static <T extends RealFieldElement<T>> T IEEEremainder(T dividend, double divisor)
Computes the remainder as prescribed by the IEEE 754 standard. The remainder value is mathematically equal tox - y*n
wheren
is the mathematical integer closest to the exact mathematical value of the quotientx/y
. If two mathematical integers are equally close tox/y
thenn
is the integer that is even.- If either operand is NaN, the result is NaN.
- If the result is not NaN, the sign of the result equals the sign of the dividend.
- If the dividend is an infinity, or the divisor is a zero, or both, the result is NaN.
- If the dividend is finite and the divisor is an infinity, the result equals the dividend.
- If the dividend is a zero and the divisor is finite, the result equals the dividend.
- Type Parameters:
T
- the type of the field element- Parameters:
dividend
- the number to be divideddivisor
- the number by which to divide- Returns:
- the remainder, rounded
- Since:
- 1.3
-
IEEEremainder
public static <T extends RealFieldElement<T>> T IEEEremainder(T dividend, T divisor)
Computes the remainder as prescribed by the IEEE 754 standard. The remainder value is mathematically equal tox - y*n
wheren
is the mathematical integer closest to the exact mathematical value of the quotientx/y
. If two mathematical integers are equally close tox/y
thenn
is the integer that is even.- If either operand is NaN, the result is NaN.
- If the result is not NaN, the sign of the result equals the sign of the dividend.
- If the dividend is an infinity, or the divisor is a zero, or both, the result is NaN.
- If the dividend is finite and the divisor is an infinity, the result equals the dividend.
- If the dividend is a zero and the divisor is finite, the result equals the dividend.
- Type Parameters:
T
- the type of the field element- Parameters:
dividend
- the number to be divideddivisor
- the number by which to divide- Returns:
- the remainder, rounded
- Since:
- 1.3
-
copySign
public static <T extends RealFieldElement<T>> T copySign(T magnitude, T sign)
Returns the first argument with the sign of the second argument. A NaNsign
argument is treated as positive.- Type Parameters:
T
- the type of the field element- Parameters:
magnitude
- the value to returnsign
- the sign for the returned value- Returns:
- the magnitude with the same sign as the
sign
argument - Since:
- 1.3
-
copySign
public static <T extends RealFieldElement<T>> T copySign(T magnitude, double sign)
Returns the first argument with the sign of the second argument. A NaNsign
argument is treated as positive.- Type Parameters:
T
- the type of the field element- Parameters:
magnitude
- the value to returnsign
- the sign for the returned value- Returns:
- the magnitude with the same sign as the
sign
argument - Since:
- 1.3
-
main
public static void main(String[] a)
Print out contents of arrays, and check the length.used to generate the preset arrays originally.
- Parameters:
a
- unused
-
-