You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by er...@apache.org on 2018/01/26 14:44:28 UTC
[08/36] commons-numbers git commit: merge master and eb-test branches
into commons-dev branch. I was mistakenly still making edits to eb-test
branch.
merge master and eb-test branches into commons-dev branch. I was mistakenly still making edits to eb-test branch.
Project: http://git-wip-us.apache.org/repos/asf/commons-numbers/repo
Commit: http://git-wip-us.apache.org/repos/asf/commons-numbers/commit/410abd7f
Tree: http://git-wip-us.apache.org/repos/asf/commons-numbers/tree/410abd7f
Diff: http://git-wip-us.apache.org/repos/asf/commons-numbers/diff/410abd7f
Branch: refs/heads/master
Commit: 410abd7fa4f63d8c2d297b62181ddfeeb44da869
Parents: e2668df ec66bce
Author: Eric Barnhill <er...@apache.org>
Authored: Sun Apr 23 19:42:53 2017 +0200
Committer: Eric Barnhill <er...@apache.org>
Committed: Sun Apr 23 19:42:53 2017 +0200
----------------------------------------------------------------------
.../apache/commons/numbers/complex/Complex.java | 244 +++++++++----------
.../commons/numbers/fraction/BigFraction.java | 16 +-
.../numbers/fraction/ContinuedFraction.java | 166 +++++++++++++
.../numbers/fraction/BigFractionTest.java | 22 ++
.../numbers/fraction/ContinuedFractionTest.java | 45 ++++
pom.xml | 2 +-
src/changes/changes.xml | 8 +-
src/site/site.xml | 2 +-
8 files changed, 366 insertions(+), 139 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/commons-numbers/blob/410abd7f/commons-numbers-complex/src/main/java/org/apache/commons/numbers/complex/Complex.java
----------------------------------------------------------------------
diff --cc commons-numbers-complex/src/main/java/org/apache/commons/numbers/complex/Complex.java
index 42cd0cc,ccd25d1..1189451
--- a/commons-numbers-complex/src/main/java/org/apache/commons/numbers/complex/Complex.java
+++ b/commons-numbers-complex/src/main/java/org/apache/commons/numbers/complex/Complex.java
@@@ -20,11 -20,9 +20,9 @@@ package org.apache.commons.numbers.comp
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
-
import org.apache.commons.numbers.core.Precision;
-
/**
- * Representation of a Complex number, i.e., a number which has both a
+ * Representation of a Complex number, i.e. a number which has both a
* real and imaginary part.
* <p>
* Implementations of arithmetic operations handle {@code NaN} and
@@@ -96,56 -94,8 +94,56 @@@ public class Complex implements Seriali
(Double.isInfinite(real) || Double.isInfinite(imaginary));
}
+ /**
+ * Creates a Complex from its polar representation.
+ * <p>
+ * If either {@code r} or {@code theta} is NaN, or {@code theta} is
+ * infinite, {@link Complex#NaN} is returned.
+ * <p>
+ * If {@code r} is infinite and {@code theta} is finite, infinite or NaN
+ * values may be returned in parts of the result, following the rules for
+ * double arithmetic.
+ *
+ * <pre>
+ * Examples:
+ * {@code
+ * polar2Complex(INFINITY, \(\pi\)) = INFINITY + INFINITY i
+ * polar2Complex(INFINITY, 0) = INFINITY + NaN i
+ * polar2Complex(INFINITY, \(-\frac{\pi}{4}\)) = INFINITY - INFINITY i
+ * polar2Complex(INFINITY, \(5\frac{\pi}{4}\)) = -INFINITY - INFINITY i }
+ * </pre>
+ *
+ * @param r the modulus of the complex number to create
+ * @param theta the argument of the complex number to create
+ * @return {@code Complex}
+ * @since 1.1
+ */
+ public Complex polar(double r, double theta) {
+ checkNotNegative(r);
+ return new Complex(r * Math.cos(theta), r * Math.sin(theta));
+ }
+
/**
- * Returns projection of this Complex number onto the Riemann sphere,
++ * Returns projection of this complex number onto the Riemann sphere,
+ * i.e. all infinities (including those with an NaN component)
+ * project onto real infinity, as described in the
+ * <a href="http://pubs.opengroup.org/onlinepubs/9699919799/functions/cproj.html">
+ * IEEE and ISO C standards</a>.
+ * <p>
+ *
+ *
+ * @return {@code Complex} projected onto the Riemann sphere.
+ */
+ public Complex proj() {
+ if (isInfinite) {
+ return new Complex(Double.POSITIVE_INFINITY);
+ } else {
+ return this;
+ }
+ }
+
+ /**
- * Return the absolute value of this Complex number.
+ * Return the absolute value of this complex number.
* Returns {@code NaN} if either real or imaginary part is {@code NaN}
* and {@code Double.POSITIVE_INFINITY} if neither part is {@code NaN},
* but at least one part is infinite.
@@@ -174,19 -125,6 +173,19 @@@
}
}
+ /**
- * Return the norm of this Complex number, defined as the square of the magnitude
++ * Return the norm of this complex number, defined as the square of the magnitude
+ * (Matches C++ 11 standards.)
+ * Returns {@code NaN} if either real or imaginary part is {@code NaN}
+ * and {@code Double.POSITIVE_INFINITY} if neither part is {@code NaN},
+ * but at least one part is infinite.
+ *
+ * @return the absolute value.
+ */
+ public double norm() {
+ return abs()*abs();
+ }
+
/**
* Returns a {@code Complex} whose value is
* {@code (this + addend)}.
@@@ -234,14 -171,14 +233,14 @@@
* The conjugate of {@code a + bi} is {@code a - bi}.
* <p>
* {@link #NaN} is returned if either the real or imaginary
-- * part of this Complex number equals {@code Double.NaN}.
++ * part of this complex number equals {@code Double.NaN}.
* </p><p>
* If the imaginary part is infinite, and the real part is not
* {@code NaN}, the returned value has infinite imaginary part
* of the opposite sign, e.g. the conjugate of
* {@code 1 + POSITIVE_INFINITY i} is {@code 1 - NEGATIVE_INFINITY i}.
* </p>
-- * @return the conjugate of this Complex object.
++ * @return the conjugate of this complex object.
*/
public Complex conjugate() {
if (isNaN) {
@@@ -251,17 -188,6 +250,17 @@@
return createComplex(real, -imaginary);
}
+ /**
- * Returns the conjugate of this Complex number.
++ * Returns the conjugate of this complex number.
+ * C++11 grammar.
+ * </p>
- * @return the conjugate of this Complex object.
++ * @return the conjugate of this complex object.
+ */
+ public Complex conj() {
+ return conjugate();
+ }
+
+
/**
* Returns a {@code Complex} whose value is
* {@code (this / divisor)}.
@@@ -302,10 -228,8 +301,9 @@@
*
* @param divisor Value by which this {@code Complex} is to be divided.
* @return {@code this / divisor}.
+ * @if {@code divisor} is {@code null}.
*/
- public Complex divide(Complex divisor)
- {
+ public Complex divide(Complex divisor) {
checkNotNull(divisor);
if (isNaN || divisor.isNaN) {
return NaN;
@@@ -547,20 -457,11 +545,20 @@@
return real;
}
- /**
+ /**
+ * Access the real part (C++ grammar)
+ *
+ * @return the real part.
+ */
+ public double real() {
+ return real;
+ }
+
+ /**
- * Checks whether either or both parts of this Complex number is
+ * Checks whether either or both parts of this complex number is
* {@code NaN}.
*
- * @return true if either or both parts of this Complex number is
+ * @return true if either or both parts of this complex number is
* {@code NaN}; false otherwise.
*/
public boolean isNaN() {
@@@ -600,10 -501,8 +598,9 @@@
*
* @param factor value to be multiplied by this {@code Complex}.
* @return {@code this * factor}.
+ * @if {@code factor} is {@code null}.
*/
- public Complex multiply(Complex factor)
- {
+ public Complex multiply(Complex factor) {
checkNotNull(factor);
if (isNaN || factor.isNaN) {
return NaN;
@@@ -662,7 -561,7 +659,7 @@@
/**
* Returns a {@code Complex} whose value is {@code (-this)}.
* Returns {@code NaN} if either real or imaginary
-- * part of this Complex number is {@code Double.NaN}.
++ * part of this complex number is {@code Double.NaN}.
*
* @return {@code -this}.
*/
@@@ -785,86 -679,8 +777,86 @@@
/**
* Compute the
+ * <a href="http://mathworld.wolfram.com/InverseHyperbolicSine.html" TARGET="_top">
- * inverse hyperbolic sine</a> of this Complex number.
++ * inverse hyperbolic sine</a> of this complex number.
+ * Implements the formula:
+ * <p>
+ * {@code asinh(z) = log(z+sqrt(z^2+1))}
+ * </p><p>
+ * Returns {@link Complex#NaN} if either real or imaginary part of the
+ * input argument is {@code NaN} or infinite.</p>
+ *
- * @return the inverse hyperbolic cosine of this Complex number
++ * @return the inverse hyperbolic cosine of this complex number
+ * @since 1.2
+ */
+ public Complex asinh(){
+ if (isNaN) {
+ return NaN;
+ }
+
+ return square().add(Complex.ONE).sqrt().add(this).log();
+ }
+
+ /**
+ * Compute the
+ * <a href="http://mathworld.wolfram.com/InverseHyperbolicTangent.html" TARGET="_top">
- * inverse hyperbolic tangent</a> of this Complex number.
++ * inverse hyperbolic tangent</a> of this complex number.
+ * Implements the formula:
+ * <p>
+ * {@code atanh(z) = log((1+z)/(1-z))/2}
+ * </p><p>
+ * Returns {@link Complex#NaN} if either real or imaginary part of the
+ * input argument is {@code NaN} or infinite.</p>
+ *
- * @return the inverse hyperbolic cosine of this Complex number
++ * @return the inverse hyperbolic cosine of this complex number
+ * @since 1.2
+ */
+ public Complex atanh(){
+ if (isNaN) {
+ return NaN;
+ }
+
+ return this.add(Complex.ONE).divide(Complex.ONE.subtract(this)).log().divide(new Complex(2));
+ }
+ /**
+ * Compute the
+ * <a href="http://mathworld.wolfram.com/InverseHyperbolicCosine.html" TARGET="_top">
- * inverse hyperbolic cosine</a> of this Complex number.
++ * inverse hyperbolic cosine</a> of this complex number.
+ * Implements the formula:
+ * <p>
+ * {@code acosh(z) = log(z+sqrt(z^2-1))}
+ * </p><p>
+ * Returns {@link Complex#NaN} if either real or imaginary part of the
+ * input argument is {@code NaN} or infinite.</p>
+ *
- * @return the inverse hyperbolic cosine of this Complex number
++ * @return the inverse hyperbolic cosine of this complex number
+ * @since 1.2
+ */
+ public Complex acosh() {
+ if (isNaN) {
+ return NaN;
+ }
+
+ return square().subtract(Complex.ONE).sqrt().add(this).log();
+ }
+
+ /**
- * Compute the square of this Complex number.
++ * Compute the square of this complex number.
+ *
- * @return square of this Complex number
++ * @return square of this complex number
+ */
+ public Complex square(){
+ if (isNaN) {
+ return NaN;
+ }
+
+ return this.multiply(this);
+ }
+
+ /**
+ * Compute the
* <a href="http://mathworld.wolfram.com/Cosine.html" TARGET="_top">
- * cosine</a> of this Complex number.
+ * cosine</a> of this complex number.
* Implements the formula:
* <p>
* {@code cos(a + bi) = cos(a)cosh(b) - sin(a)sinh(b)i}
@@@ -1025,19 -838,7 +1014,19 @@@
}
/**
+ * Compute the base 10 or
+ * <a href="http://mathworld.wolfram.com/CommonLogarithm.html" TARGET="_top">
- * common logarithm</a> of this Complex number.
++ * common logarithm</a> of this complex number.
+ *
+ * @return the base 10 logarithm of <code>this</code>.
+ */
+ public Complex log10() {
+ return createComplex(Math.log(abs())/Math.log(10),
+ Math.atan2(imaginary, real));
+ }
+
+ /**
- * Returns of value of this Complex number raised to the power of {@code x}.
+ * Returns of value of this complex number raised to the power of {@code x}.
* Implements the formula:
* <pre>
* <code>
@@@ -1328,8 -1138,10 +1326,8 @@@
Math.sin(imaginary2) / d);
}
-
-
-- /**
- * Compute the argument of this Complex number.
++ /**
+ * Compute the argument of this complex number.
* The argument is the angle phi between the positive real axis and
* the point representing this number in the complex plane.
* The value returned is between -PI (not inclusive)
@@@ -1350,28 -1162,7 +1348,17 @@@
}
/**
- * Compute the argument of this Complex number.
- * The argument is the angle phi between the positive real axis and
- * the point representing this number in the complex plane.
- * The value returned is between -PI (not inclusive)
- * and PI (inclusive), with negative values returned for numbers with
- * negative imaginary parts.
- * <p>
- * If either real or imaginary part (or both) is NaN, NaN is returned.
- * Infinite parts are handled as {@code Math.atan2} handles them,
- * essentially treating finite parts as zero in the presence of an
- * infinite coordinate and returning a multiple of pi/4 depending on
- * the signs of the infinite parts.
- * See the javadoc for {@code Math.atan2} for full details.
++ * Compute the argument of this complex number.
++ * C++11 syntax
+ *
+ * @return the argument of {@code this}.
+ */
+ public double arg() {
+ return getArgument();
+ }
+
+ /**
- * Computes the n-th roots of this Complex number.
+ * Computes the n-th roots of this complex number.
* The nth roots are defined by the formula:
* <pre>
* <code>
@@@ -1497,27 -1286,16 +1482,28 @@@
}
}
+
+ /**
+ * Check that the argument is positive and throw a RuntimeException
+ * if it is not.
+ * @param arg {@code int} to check
+ */
+ private static void checkNotNegative(int arg) {
+ if (arg <= 0) {
+ throw new RuntimeException("Complex: Non-positive argument");
+ }
+ }
+
/**
- * Check that the Complex is not null and throw a RuntimeException
- * if it is.
- * @param arg the Complex to check
+ * Returns {@code true} if the values are equal according to semantics of
+ * {@link Double#equals(Object)}.
+ *
+ * @param x Value
+ * @param y Value
+ * @return {@code new Double(x).equals(new Double(y))}
*/
- private static void checkNotNull(Complex arg) {
- if (arg == null) {
- throw new RuntimeException("Complex: Null argument");
- }
+ private static boolean equals(double x, double y) {
+ return new Double(x).equals(new Double(y));
}
/**