Merge branch 'NUMBERS-40__Matt'

Closes #74.
diff --git a/commons-numbers-arrays/src/main/java/org/apache/commons/numbers/arrays/CosAngle.java b/commons-numbers-arrays/src/main/java/org/apache/commons/numbers/arrays/CosAngle.java
index dbddbbc..e728d21 100644
--- a/commons-numbers-arrays/src/main/java/org/apache/commons/numbers/arrays/CosAngle.java
+++ b/commons-numbers-arrays/src/main/java/org/apache/commons/numbers/arrays/CosAngle.java
@@ -32,6 +32,7 @@
      * @param v1 Cartesian coordinates of the first vector.
      * @param v2 Cartesian coordinates of the second vector.
      * @return the cosine of the angle between the vectors.
+     * @throws IllegalArgumentException if the sizes of the input arrays are different
      */
     public static double value(double[] v1,
                                double[] v2) {
diff --git a/commons-numbers-arrays/src/test/java/org/apache/commons/numbers/arrays/CosAngleTest.java b/commons-numbers-arrays/src/test/java/org/apache/commons/numbers/arrays/CosAngleTest.java
index ffef55c..758ee3f 100644
--- a/commons-numbers-arrays/src/test/java/org/apache/commons/numbers/arrays/CosAngleTest.java
+++ b/commons-numbers-arrays/src/test/java/org/apache/commons/numbers/arrays/CosAngleTest.java
@@ -23,6 +23,7 @@
  * Test cases for the {@link CosAngle} class.
  */
 public class CosAngleTest {
+
     @Test
     public void testCosAngle2D() {
         double expected;
@@ -77,4 +78,14 @@
         expected = 0;
         Assertions.assertEquals(expected, CosAngle.value(v1, v3), 1e-15);
     }
+
+    @Test
+    public void testCosAngle_dimensionMismatch() {
+        final double[] a = {1.0};
+        final double[] b = {1.0, 2.0};
+
+        Assertions.assertThrows(IllegalArgumentException.class, () -> {
+            CosAngle.value(a, b);
+        });
+    }
 }
diff --git a/commons-numbers-combinatorics/src/main/java/org/apache/commons/numbers/combinatorics/BinomialCoefficient.java b/commons-numbers-combinatorics/src/main/java/org/apache/commons/numbers/combinatorics/BinomialCoefficient.java
index 801669e..d19f592 100644
--- a/commons-numbers-combinatorics/src/main/java/org/apache/commons/numbers/combinatorics/BinomialCoefficient.java
+++ b/commons-numbers-combinatorics/src/main/java/org/apache/commons/numbers/combinatorics/BinomialCoefficient.java
@@ -33,7 +33,7 @@
     }
 
     /**
-     * Computes de binomial coefficient.
+     * Computes the binomial coefficient.
      * The largest value of {@code n} for which all coefficients can
      * fit into a {@code long} is 66.
      *
diff --git a/commons-numbers-combinatorics/src/main/java/org/apache/commons/numbers/combinatorics/BinomialCoefficientDouble.java b/commons-numbers-combinatorics/src/main/java/org/apache/commons/numbers/combinatorics/BinomialCoefficientDouble.java
index b0b276e..bd95280 100644
--- a/commons-numbers-combinatorics/src/main/java/org/apache/commons/numbers/combinatorics/BinomialCoefficientDouble.java
+++ b/commons-numbers-combinatorics/src/main/java/org/apache/commons/numbers/combinatorics/BinomialCoefficientDouble.java
@@ -31,7 +31,7 @@
     }
 
     /**
-     * Computes de binomial coefficient.
+     * Computes the binomial coefficient.
      * The largest value of {@code n} for which all coefficients can
      * fit into a {@code long} is 66.
      *
@@ -40,8 +40,6 @@
      * @return {@code n choose k}.
      * @throws IllegalArgumentException if {@code n < 0}.
      * @throws IllegalArgumentException if {@code k > n}.
-     * @throws IllegalArgumentException if the result is too large to be
-     * represented by a {@code long}.
      */
     public static double value(int n, int k) {
         BinomialCoefficient.checkBinomial(n, k);
diff --git a/commons-numbers-combinatorics/src/main/java/org/apache/commons/numbers/combinatorics/LogBinomialCoefficient.java b/commons-numbers-combinatorics/src/main/java/org/apache/commons/numbers/combinatorics/LogBinomialCoefficient.java
index d8464e4..dad945c 100644
--- a/commons-numbers-combinatorics/src/main/java/org/apache/commons/numbers/combinatorics/LogBinomialCoefficient.java
+++ b/commons-numbers-combinatorics/src/main/java/org/apache/commons/numbers/combinatorics/LogBinomialCoefficient.java
@@ -40,8 +40,6 @@
      * @return {@code log(n choose k)}.
      * @throws IllegalArgumentException if {@code n < 0}.
      * @throws IllegalArgumentException if {@code k > n}.
-     * @throws IllegalArgumentException if the result is too large to be
-     * represented by a {@code long}.
      */
     public static double value(int n, int k) {
         BinomialCoefficient.checkBinomial(n, k);
diff --git a/commons-numbers-complex-streams/src/main/java/org/apache/commons/numbers/complex/streams/ComplexUtils.java b/commons-numbers-complex-streams/src/main/java/org/apache/commons/numbers/complex/streams/ComplexUtils.java
index fb1ea4c..fcd1975 100644
--- a/commons-numbers-complex-streams/src/main/java/org/apache/commons/numbers/complex/streams/ComplexUtils.java
+++ b/commons-numbers-complex-streams/src/main/java/org/apache/commons/numbers/complex/streams/ComplexUtils.java
@@ -57,6 +57,7 @@
      * @param r the modulus of the complex number to create
      * @param theta the argument of the complex number to create
      * @return {@code Complex}
+     * @throws IllegalArgumentException if {@code r} is negative
      */
     public static Complex polar2Complex(double r, double theta) {
         if (r < 0) {
@@ -72,6 +73,7 @@
      * @param r {@code double[]} of moduli
      * @param theta {@code double[]} of arguments
      * @return {@code Complex[]}
+     * @throws IllegalArgumentException if any element in {@code r} is negative
      */
     public static Complex[] polar2Complex(double[] r, double[] theta) {
         final int length = r.length;
@@ -92,6 +94,7 @@
      * @param r {@code double[]} of moduli
      * @param theta {@code double[]} of arguments
      * @return {@code Complex[][]}
+     * @throws IllegalArgumentException if any element in {@code r} is negative
      */
     public static Complex[][] polar2Complex(double[][] r, double[][] theta) {
         final int length = r.length;
@@ -109,6 +112,7 @@
      * @param r array of moduli
      * @param theta array of arguments
      * @return {@code Complex}
+     * @throws IllegalArgumentException if any element in {@code r} is negative
      */
     public static Complex[][][] polar2Complex(double[][][] r, double[][][] theta) {
         final int length = r.length;
@@ -220,7 +224,8 @@
      * {@code index}.
      *
      * @param d array of interleaved complex numbers alternating real and imaginary values
-     * @param index location in the array This is the location by complex number, e.g. index number 5 in the array will return {@code Complex.ofCartesian(d[10], d[11])}
+     * @param index location in the array This is the location by complex number, e.g. index number 5 in the
+     *      array will return {@code Complex.ofCartesian(d[10], d[11])}
      * @return {@code Complex}.
      */
     public static Complex extractComplexFromInterleavedArray(double[] d, int index) {
@@ -232,7 +237,8 @@
      * {@code index}.
      *
      * @param f float array of interleaved complex numbers alternating real and imaginary values
-     * @param index location in the array This is the location by complex number, e.g. index number 5 in the {@code float[]} array will return new {@code Complex(d[10], d[11])}
+     * @param index location in the array This is the location by complex number, e.g. index number 5
+     *      in the {@code float[]} array will return new {@code Complex(d[10], d[11])}
      * @return {@code Complex}.
      */
     public static Complex extractComplexFromInterleavedArray(float[] f, int index) {
@@ -800,6 +806,7 @@
      * @param interleavedDim Depth level of the array to interleave
      * @return complex interleaved array alternating real and
      *         imaginary values
+     * @throws IllegalArgumentException if {@code interleavedDim} is not 0 or 1
      */
     public static double[][] complex2Interleaved(Complex[][] c, int interleavedDim) {
         if (interleavedDim > 1 || interleavedDim < 0) {
@@ -849,6 +856,7 @@
      * @param interleavedDim Depth level of the array to interleave
      * @return complex interleaved array alternating real and
      *         imaginary values
+     * @throws IllegalArgumentException if {@code interleavedDim} is not 0, 1, or 2
      */
     public static double[][][] complex2Interleaved(Complex[][][] c, int interleavedDim) {
         if (interleavedDim > 2 || interleavedDim < 0) {
@@ -900,6 +908,7 @@
      * @param interleavedDim Depth level of the array to interleave
      * @return complex interleaved array alternating real and
      *         imaginary values
+     * @throws IllegalArgumentException if {@code interleavedDim} is not in the range {@code [0, 3]}
      */
     public static double[][][][] complex2Interleaved(Complex[][][][] c, int interleavedDim) {
         if (interleavedDim > 3 || interleavedDim < 0) {
@@ -996,6 +1005,7 @@
      * @param interleavedDim Depth level of the array to interleave
      * @return complex interleaved {@code float[][]} alternating real and
      *         imaginary values
+     * @throws IllegalArgumentException if {@code interleavedDim} is not 0 or 1
      */
     public static float[][] complex2InterleavedFloat(Complex[][] c, int interleavedDim) {
         if (interleavedDim > 1 || interleavedDim < 0) {
@@ -1046,6 +1056,7 @@
      * @param interleavedDim Depth level of the array to interleave
      * @return complex interleaved {@code float[][][]} alternating real and
      *         imaginary values
+     * @throws IllegalArgumentException if {@code interleavedDim} is not 0, 1, or 2
      */
     public static float[][][] complex2InterleavedFloat(Complex[][][] c, int interleavedDim) {
         if (interleavedDim > 2 || interleavedDim < 0) {
@@ -1110,6 +1121,7 @@
      * @param i 2D complex interleaved array
      * @param interleavedDim Depth level of the array to interleave
      * @return 2D {@code Complex} array
+     * @throws IllegalArgumentException if {@code interleavedDim} is not 0 or 1
      */
     public static Complex[][] interleaved2Complex(double[][] i, int interleavedDim) {
         if (interleavedDim > 1 || interleavedDim < 0) {
@@ -1155,6 +1167,7 @@
      * @param i 3D complex interleaved array
      * @param interleavedDim Depth level of the array to interleave
      * @return 3D {@code Complex} array
+     * @throws IllegalArgumentException if {@code interleavedDim} is not 0, 1, or 2
      */
     public static Complex[][][] interleaved2Complex(double[][][] i, int interleavedDim) {
         if (interleavedDim > 2 || interleavedDim < 0) {
@@ -1202,6 +1215,7 @@
      * @param i 4D complex interleaved array
      * @param interleavedDim Depth level of the array to interleave
      * @return 4D {@code Complex} array
+     * @throws IllegalArgumentException if {@code interleavedDim} is not in the range {@code [0, 3]}
      */
     public static Complex[][][][] interleaved2Complex(double[][][][] i, int interleavedDim) {
         if (interleavedDim > 3 || interleavedDim < 0) {
@@ -1279,6 +1293,7 @@
      * @param i 2D complex interleaved float array
      * @param interleavedDim Depth level of the array to interleave
      * @return 2D {@code Complex} array
+     * @throws IllegalArgumentException if {@code interleavedDim} is not 0 or 1
      */
     public static Complex[][] interleaved2Complex(float[][] i, int interleavedDim) {
         if (interleavedDim > 1 || interleavedDim < 0) {
@@ -1324,6 +1339,7 @@
      * @param i 3D complex interleaved float array
      * @param interleavedDim Depth level of the array to interleave
      * @return 3D {@code Complex} array
+     * @throws IllegalArgumentException if {@code interleavedDim} is not 0, 1, or 2
      */
     public static Complex[][][] interleaved2Complex(float[][][] i, int interleavedDim) {
         if (interleavedDim > 2 || interleavedDim < 0) {
diff --git a/commons-numbers-fraction/src/main/java/org/apache/commons/numbers/fraction/BigFraction.java b/commons-numbers-fraction/src/main/java/org/apache/commons/numbers/fraction/BigFraction.java
index 3821496..2f9c1d0 100644
--- a/commons-numbers-fraction/src/main/java/org/apache/commons/numbers/fraction/BigFraction.java
+++ b/commons-numbers-fraction/src/main/java/org/apache/commons/numbers/fraction/BigFraction.java
@@ -337,6 +337,7 @@
      * @param num the numerator.
      * @param den the denominator.
      * @return a new instance.
+     * @throws ArithmeticException if {@code den} is zero.
      */
     public static BigFraction of(final int num, final int den) {
         return new BigFraction(BigInteger.valueOf(num), BigInteger.valueOf(den));
@@ -363,6 +364,7 @@
      * @param num the numerator.
      * @param den the denominator.
      * @return a new instance.
+     * @throws ArithmeticException if {@code den} is zero.
      */
     public static BigFraction of(final long num, final long den) {
         return new BigFraction(BigInteger.valueOf(num), BigInteger.valueOf(den));
@@ -511,6 +513,8 @@
      *            see {@link BigDecimal} for more information.
      * @param roundingMode Rounding mode to apply.
      * @return the fraction as a <code>BigDecimal</code>.
+     * @throws ArithmeticException if {@code roundingMode} == {@link RoundingMode#UNNECESSARY} and
+     *      the specified scale is insufficient to represent the result of the division exactly.
      * @see BigDecimal
      */
     public BigDecimal bigDecimalValue(final int scale, RoundingMode roundingMode) {
@@ -553,7 +557,7 @@
      *
      * @param bg the {@code BigInteger} to divide by, must not be {@code null}
      * @return a {@link BigFraction} instance with the resulting values
-     * @throws ArithmeticException if the fraction to divide by is zero
+     * @throws ArithmeticException if the value to divide by is zero
      */
     public BigFraction divide(final BigInteger bg) {
         if (bg.signum() == 0) {
@@ -573,7 +577,7 @@
      *
      * @param i the {@code int} to divide by
      * @return a {@link BigFraction} instance with the resulting values
-     * @throws ArithmeticException if the fraction to divide by is zero
+     * @throws ArithmeticException if the value to divide by is zero
      */
     public BigFraction divide(final int i) {
         return divide(BigInteger.valueOf(i));
@@ -587,7 +591,7 @@
      *
      * @param l the {@code long} to divide by
      * @return a {@link BigFraction} instance with the resulting values
-     * @throws ArithmeticException if the fraction to divide by is zero
+     * @throws ArithmeticException if the value to divide by is zero
      */
     public BigFraction divide(final long l) {
         return divide(BigInteger.valueOf(l));
diff --git a/commons-numbers-fraction/src/main/java/org/apache/commons/numbers/fraction/Fraction.java b/commons-numbers-fraction/src/main/java/org/apache/commons/numbers/fraction/Fraction.java
index 13df694..bdc39f5 100644
--- a/commons-numbers-fraction/src/main/java/org/apache/commons/numbers/fraction/Fraction.java
+++ b/commons-numbers-fraction/src/main/java/org/apache/commons/numbers/fraction/Fraction.java
@@ -68,7 +68,7 @@
      * within {@code epsilon} of {@code value}, in absolute terms.
      * @param maxDenominator maximum denominator value allowed.
      * @param maxIterations maximum number of convergents
-     * @throws IllegalArgumentException if the continued fraction failed
+     * @throws ArithmeticException if the continued fraction failed
      * to converge.
      */
     private Fraction(double value, double epsilon, int maxDenominator, int maxIterations) {
@@ -183,7 +183,7 @@
      * Creates an instance.
      *
      * @param value Value to convert to a fraction.
-     * @throws IllegalArgumentException if the continued fraction failed to
+     * @throws ArithmeticException if the continued fraction failed to
      * converge.
      * @return a new instance.
      */
@@ -205,7 +205,7 @@
      * @param epsilon maximum error allowed.  The resulting fraction is within
      * {@code epsilon} of {@code value}, in absolute terms.
      * @param maxIterations maximum number of convergents
-     * @throws IllegalArgumentException if the continued fraction failed to
+     * @throws ArithmeticException if the continued fraction failed to
      * converge.
      * @return a new instance.
      */
@@ -225,7 +225,7 @@
      *
      * @param value the double value to convert to a fraction.
      * @param maxDenominator The maximum allowed value for denominator
-     * @throws IllegalArgumentException if the continued fraction failed to
+     * @throws ArithmeticException if the continued fraction failed to
      * converge.
      * @return a new instance.
      */
@@ -422,7 +422,7 @@
      * @param fraction Fraction to add.
      * @return a new instance.
      * @throws ArithmeticException if the resulting numerator or denominator
-     * exceeds {@code Integer.MAX_VALUE}
+     * cannot be represented in an {@code int}.
      */
     @Override
     public Fraction add(Fraction fraction) {
@@ -522,7 +522,7 @@
      * @param fraction Fraction to multiply by.
      * @return a new instance.
      * @throws ArithmeticException if the resulting numerator or denominator
-     * exceeds {@code Integer.MAX_VALUE}
+     * cannot be represented in an {@code int}.
      */
     @Override
     public Fraction multiply(Fraction fraction) {
@@ -556,8 +556,8 @@
      * @param fraction Fraction to divide by.
      * @return a new instance.
      * @throws ArithmeticException if the fraction to divide by is zero
-     * or if the resulting numerator or denominator exceeds
-     * {@code Integer.MAX_VALUE}
+     * or if the resulting numerator or denominator cannot be represented
+     * by an {@code int}.
      */
     @Override
     public Fraction divide(Fraction fraction) {
diff --git a/commons-numbers-gamma/src/main/java/org/apache/commons/numbers/gamma/ErfDifference.java b/commons-numbers-gamma/src/main/java/org/apache/commons/numbers/gamma/ErfDifference.java
index 1fbd36f..157beed 100644
--- a/commons-numbers-gamma/src/main/java/org/apache/commons/numbers/gamma/ErfDifference.java
+++ b/commons-numbers-gamma/src/main/java/org/apache/commons/numbers/gamma/ErfDifference.java
@@ -45,6 +45,7 @@
      * @param x1 First value.
      * @param x2 Second value.
      * @return {@link Erf#value(double) Erf.value(x2) - Erf.value(x1)}.
+     * @throws ArithmeticException if the algorithm fails to converge.
      */
     public static double value(double x1,
                                double x2) {
diff --git a/commons-numbers-gamma/src/main/java/org/apache/commons/numbers/gamma/GammaException.java b/commons-numbers-gamma/src/main/java/org/apache/commons/numbers/gamma/GammaException.java
index 13e9276..9c0eae1 100644
--- a/commons-numbers-gamma/src/main/java/org/apache/commons/numbers/gamma/GammaException.java
+++ b/commons-numbers-gamma/src/main/java/org/apache/commons/numbers/gamma/GammaException.java
@@ -24,8 +24,6 @@
 class GammaException extends IllegalArgumentException {
     /** Error message for "out of range" condition. */
     static final String OUT_OF_RANGE = "Number {0} is out of range [{1}, {2}]";
-    /** Error message for convergence failure. */
-    static final String CONVERGENCE = "Failed to converge within {0} iterations";
 
     /** Serializable version identifier. */
     private static final long serialVersionUID = 20170505L;
diff --git a/commons-numbers-gamma/src/main/java/org/apache/commons/numbers/gamma/RegularizedGamma.java b/commons-numbers-gamma/src/main/java/org/apache/commons/numbers/gamma/RegularizedGamma.java
index 031cb59..bfefa50 100644
--- a/commons-numbers-gamma/src/main/java/org/apache/commons/numbers/gamma/RegularizedGamma.java
+++ b/commons-numbers-gamma/src/main/java/org/apache/commons/numbers/gamma/RegularizedGamma.java
@@ -16,6 +16,8 @@
  */
 package org.apache.commons.numbers.gamma;
 
+import java.text.MessageFormat;
+
 import org.apache.commons.numbers.fraction.ContinuedFraction;
 
 /**
@@ -49,6 +51,7 @@
          * @param a Argument.
          * @param x Argument.
          * @return \( P(a, x) \).
+         * @throws ArithmeticException if the continued fraction fails to converge.
          */
         public static double value(double a,
                                    double x) {
@@ -79,6 +82,7 @@
          * @param epsilon Tolerance in continued fraction evaluation.
          * @param maxIterations Maximum number of iterations in continued fraction evaluation.
          * @return \( P(a, x) \).
+         * @throws ArithmeticException if the continued fraction fails to converge.
          */
         public static double value(double a,
                                    double x,
@@ -110,7 +114,8 @@
                     sum += an;
                 }
                 if (n >= maxIterations) {
-                    throw new GammaException(GammaException.CONVERGENCE, maxIterations);
+                    throw new ArithmeticException(
+                            MessageFormat.format("Failed to converge within {0} iterations", maxIterations));
                 } else if (Double.isInfinite(sum)) {
                     return 1;
                 } else {
@@ -136,6 +141,7 @@
          * @param a Argument.
          * @param x Argument.
          * @return \( Q(a, x) \).
+         * @throws ArithmeticException if the continued fraction fails to converge.
          */
         public static double value(double a,
                                    double x) {
@@ -162,6 +168,7 @@
          * @param x Argument.
          * @param epsilon Tolerance in continued fraction evaluation.
          * @param maxIterations Maximum number of iterations in continued fraction evaluation.
+         * @throws ArithmeticException if the continued fraction fails to converge.
          * @return \( Q(a, x) \).
          */
         public static double value(final double a,
diff --git a/commons-numbers-quaternion/src/main/java/org/apache/commons/numbers/quaternion/Slerp.java b/commons-numbers-quaternion/src/main/java/org/apache/commons/numbers/quaternion/Slerp.java
index 0d7b724..dcabaa7 100644
--- a/commons-numbers-quaternion/src/main/java/org/apache/commons/numbers/quaternion/Slerp.java
+++ b/commons-numbers-quaternion/src/main/java/org/apache/commons/numbers/quaternion/Slerp.java
@@ -110,7 +110,7 @@
     }
 
     /**
-     * Spherical interpolation, used whe the quaternions are too closely aligned.
+     * Spherical interpolation, used when the quaternions are too closely aligned.
      * When we may end up dividing by zero (cf. 1/sin(theta) term below).
      * {@link Linear} interpolation must be used.
      */
diff --git a/commons-numbers-rootfinder/src/main/java/org/apache/commons/numbers/rootfinder/BrentSolver.java b/commons-numbers-rootfinder/src/main/java/org/apache/commons/numbers/rootfinder/BrentSolver.java
index 39a2b49..4b7c3c3 100644
--- a/commons-numbers-rootfinder/src/main/java/org/apache/commons/numbers/rootfinder/BrentSolver.java
+++ b/commons-numbers-rootfinder/src/main/java/org/apache/commons/numbers/rootfinder/BrentSolver.java
@@ -66,6 +66,9 @@
      * @param min Lower bound.
      * @param max Upper bound.
      * @return the root.
+     * @throws IllegalArgumentException if {@code min > max}.
+     * @throws IllegalArgumentException if the given interval does
+     * not bracket the root.
      */
     public double findRoot(DoubleUnaryOperator func,
                            double min,
@@ -82,6 +85,10 @@
      * @param initial Initial guess.
      * @param max Upper bound.
      * @return the root.
+     * @throws IllegalArgumentException if {@code min > max} or
+     * {@code initial} is not in the {@code [min, max]} interval.
+     * @throws IllegalArgumentException if the given interval does
+     * not bracket the root.
      */
     public double findRoot(DoubleUnaryOperator func,
                            double min,