Package org.hipparchus.dfp
Class DfpMath
 java.lang.Object

 org.hipparchus.dfp.DfpMath

public class DfpMath extends Object


Method Summary
All Methods Static Methods Concrete Methods Modifier and Type Method Description static Dfp
acos(Dfp a)
computes the arccosine of the argument.static Dfp
asin(Dfp a)
computes the arcsine of the argument.static Dfp
atan(Dfp a)
computes the arc tangent of the argument Uses the typical taylor series but may reduce arguments using the following identity tan(x+y) = (tan(x) + tan(y)) / (1  tan(x)*tan(y)) since tan(PI/8) = sqrt(2)1, atan(x) = atan( (x  sqrt(2) + 1) / (1+x*sqrt(2)  x) + PI/8.0protected static Dfp
atanInternal(Dfp a)
computes the arctangent of the argument.static Dfp
cos(Dfp a)
computes the cosine of the argument.protected static Dfp
cosInternal(Dfp[] a)
Computes cos(a) Used when 0 < a < pi/4.static Dfp
exp(Dfp a)
Computes e to the given power.protected static Dfp
expInternal(Dfp a)
Computes e to the given power.static Dfp
log(Dfp a)
Returns the natural logarithm of a.protected static Dfp[]
logInternal(Dfp[] a)
Computes the natural log of a number between 0 and 2.static Dfp
pow(Dfp base, int a)
Raises base to the power a by successive squaring.static Dfp
pow(Dfp x, Dfp y)
Computes x to the y power.static Dfp
sin(Dfp a)
computes the sine of the argument.protected static Dfp
sinInternal(Dfp[] a)
Computes sin(a) Used when 0 < a < pi/4.protected static Dfp[]
split(Dfp a)
protected static Dfp[]
split(DfpField field, String a)
Breaks a string representation up into two dfp's.protected static Dfp[]
splitDiv(Dfp[] a, Dfp[] b)
Divide two numbers that are split in to two pieces that are meant to be added together.protected static Dfp[]
splitMult(Dfp[] a, Dfp[] b)
Multiply two numbers that are split in to two pieces that are meant to be added together.protected static Dfp
splitPow(Dfp[] base, int a)
Raise a split base to the a power.static Dfp
tan(Dfp a)
computes the tangent of the argument.



Method Detail

split
protected static Dfp[] split(DfpField field, String a)
Breaks a string representation up into two dfp's.The two dfp are such that the sum of them is equivalent to the input string, but has higher precision than using a single dfp. This is useful for improving accuracy of exponentiation and critical multiplies.
 Parameters:
field
 field to which the Dfp must belonga
 string representation to split Returns:
 an array of two
Dfp
which sum is a

split
protected static Dfp[] split(Dfp a)
 Parameters:
a
 number to split Returns:
 two elements array containing the split number

splitMult
protected static Dfp[] splitMult(Dfp[] a, Dfp[] b)
Multiply two numbers that are split in to two pieces that are meant to be added together. Use binomial multiplication so ab = a0 b0 + a0 b1 + a1 b0 + a1 b1 Store the first term in result0, the rest in result1 Parameters:
a
 first factor of the multiplication, in split formb
 second factor of the multiplication, in split form Returns:
 a × b, in split form

splitDiv
protected static Dfp[] splitDiv(Dfp[] a, Dfp[] b)
Divide two numbers that are split in to two pieces that are meant to be added together. Inverse of split multiply above: (a+b) / (c+d) = (a/c) + ( (bcad)/(c**2+cd) ) Parameters:
a
 dividend, in split formb
 divisor, in split form Returns:
 a / b, in split form

splitPow
protected static Dfp splitPow(Dfp[] base, int a)
Raise a split base to the a power. Parameters:
base
 number to raisea
 power Returns:
 base^{a}

pow
public static Dfp pow(Dfp base, int a)
Raises base to the power a by successive squaring. Parameters:
base
 number to raisea
 power Returns:
 base^{a}

exp
public static Dfp exp(Dfp a)
Computes e to the given power. a is broken into two parts, such that a = n+m where n is an integer. We use pow() to compute e^{n} and a Taylor series to compute e^{m}. We return e*^{n} × e^{m} Parameters:
a
 power at which e should be raised Returns:
 e^{a}

expInternal
protected static Dfp expInternal(Dfp a)
Computes e to the given power. Where 1 < a < 1. Use the classic Taylor series. 1 + x**2/2! + x**3/3! + x**4/4! ... Parameters:
a
 power at which e should be raised Returns:
 e^{a}

log
public static Dfp log(Dfp a)
Returns the natural logarithm of a. a is first split into three parts such that a = (10000^h)(2^j)k. ln(a) is computed by ln(a) = ln(5)*h + ln(2)*(h+j) + ln(k) k is in the range 2/3 < k < 4/3 and is passed on to a series expansion. Parameters:
a
 number from which logarithm is requested Returns:
 log(a)

logInternal
protected static Dfp[] logInternal(Dfp[] a)
Computes the natural log of a number between 0 and 2. Let f(x) = ln(x), We know that f'(x) = 1/x, thus from Taylor's theorum we have:  n+1 n f(x) = \ (1) (x  1) /  for 1 <= n <= infinity  n or 2 3 4 (x1) (x1) (x1) ln(x) = (x1)   +    + ... 2 3 4 alternatively, 2 3 4 x x x ln(x+1) = x   +    + ... 2 3 4 This series can be used to compute ln(x), but it converges too slowly. If we substitute x for x above, we get 2 3 4 x x x ln(1x) = x       + ... 2 3 4 Note that all terms are now negative. Because the even powered ones absorbed the sign. Now, subtract the series above from the previous one to get ln(x+1)  ln(1x). Note the even terms cancel out leaving only the odd ones 3 5 7 2x 2x 2x ln(x+1)  ln(x1) = 2x +  +  +  + ... 3 5 7 By the property of logarithms that ln(a)  ln(b) = ln (a/b) we have: 3 5 7 x+1 / x x x \ ln  = 2 *  x +  +  +  + ...  x1 \ 3 5 7 / But now we want to find ln(a), so we need to find the value of x such that a = (x+1)/(x1). This is easily solved to find that x = (a1)/(a+1). Parameters:
a
 number from which logarithm is requested, in split form Returns:
 log(a)

pow
public static Dfp pow(Dfp x, Dfp y)
Computes x to the y power.Uses the following method:
 Set u = rint(y), v = yu
 Compute a = v * ln(x)
 Compute b = rint( a/ln(2) )
 Compute c = a  b*ln(2)
 x^{y} = x^{u} * 2^{b} * e^{c}
Special Cases
 if y is 0.0 or 0.0 then result is 1.0
 if y is 1.0 then result is x
 if y is NaN then result is NaN
 if x is NaN and y is not zero then result is NaN
 if x > 1.0 and y is +Infinity then result is +Infinity
 if x < 1.0 and y is Infinity then result is +Infinity
 if x > 1.0 and y is Infinity then result is +0
 if x < 1.0 and y is +Infinity then result is +0
 if x = 1.0 and y is +/Infinity then result is NaN
 if x = +0 and y > 0 then result is +0
 if x = +Inf and y < 0 then result is +0
 if x = +0 and y < 0 then result is +Inf
 if x = +Inf and y > 0 then result is +Inf
 if x = 0 and y > 0, finite, not odd integer then result is +0
 if x = 0 and y < 0, finite, and odd integer then result is Inf
 if x = Inf and y > 0, finite, and odd integer then result is Inf
 if x = 0 and y < 0, not finite odd integer then result is +Inf
 if x = Inf and y > 0, not finite odd integer then result is +Inf
 if x < 0 and y > 0, finite, and odd integer then result is (x^{y})
 if x < 0 and y > 0, finite, and not integer then result is NaN
 Parameters:
x
 base to be raisedy
 power to which base should be raised Returns:
 x^{y}

sinInternal
protected static Dfp sinInternal(Dfp[] a)
Computes sin(a) Used when 0 < a < pi/4. Uses the classic Taylor series. x  x**3/3! + x**5/5! ... Parameters:
a
 number from which sine is desired, in split form Returns:
 sin(a)

cosInternal
protected static Dfp cosInternal(Dfp[] a)
Computes cos(a) Used when 0 < a < pi/4. Uses the classic Taylor series for cosine. 1  x**2/2! + x**4/4! ... Parameters:
a
 number from which cosine is desired, in split form Returns:
 cos(a)

sin
public static Dfp sin(Dfp a)
computes the sine of the argument. Parameters:
a
 number from which sine is desired Returns:
 sin(a)

cos
public static Dfp cos(Dfp a)
computes the cosine of the argument. Parameters:
a
 number from which cosine is desired Returns:
 cos(a)

tan
public static Dfp tan(Dfp a)
computes the tangent of the argument. Parameters:
a
 number from which tangent is desired Returns:
 tan(a)

atanInternal
protected static Dfp atanInternal(Dfp a)
computes the arctangent of the argument. Parameters:
a
 number from which arctangent is desired Returns:
 atan(a)

atan
public static Dfp atan(Dfp a)
computes the arc tangent of the argument Uses the typical taylor series but may reduce arguments using the following identity tan(x+y) = (tan(x) + tan(y)) / (1  tan(x)*tan(y)) since tan(PI/8) = sqrt(2)1, atan(x) = atan( (x  sqrt(2) + 1) / (1+x*sqrt(2)  x) + PI/8.0 Parameters:
a
 number from which arctangent is desired Returns:
 atan(a)

asin
public static Dfp asin(Dfp a)
computes the arcsine of the argument. Parameters:
a
 number from which arcsine is desired Returns:
 asin(a)

