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

Method Summary
Modifier and TypeMethodDescriptionstatic Dfp
computes the arccosine of the argument.static Dfp
computes the arcsine of the argument.static Dfp
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
computes the cosine of the argument.protected static Dfp
cosInternal
(Dfp[] a) Computes cos(a) Used when 0 < a < pi/4.static Dfp
Computes e to the given power.protected static Dfp
expInternal
(Dfp a) Computes e to the given power.static Dfp
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
Raises base to the power a by successive squaring.static Dfp
Computes x to the y power.static Dfp
computes the sine of the argument.protected static Dfp
sinInternal
(Dfp[] a) Computes sin(a) Used when 0 < a < pi/4.protected static Dfp[]
protected static Dfp[]
Breaks a string representation up into two dfp's.protected static Dfp[]
Divide two numbers that are split in to two pieces that are meant to be added together.protected static Dfp[]
Multiply two numbers that are split in to two pieces that are meant to be added together.protected static Dfp
Raise a split base to the a power.static Dfp
computes the tangent of the argument.

Method Details

split
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
 Parameters:
a
 number to split Returns:
 two elements array containing the split number

splitMult
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
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
Raise a split base to the a power. Parameters:
base
 number to raisea
 power Returns:
 base^{a}

pow
Raises base to the power a by successive squaring. Parameters:
base
 number to raisea
 power Returns:
 base^{a}

exp
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
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
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
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
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
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
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
computes the sine of the argument. Parameters:
a
 number from which sine is desired Returns:
 sin(a)

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

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

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

atan
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
computes the arcsine of the argument. Parameters:
a
 number from which arcsine is desired Returns:
 asin(a)

acos
computes the arccosine of the argument. Parameters:
a
 number from which arccosine is desired Returns:
 acos(a)
