blob: c1999bd889fba89d65c70bc88790135fb6a2d57c [file] [log] [blame]
Raymonddee08492015-04-02 10:43:13 -07001/*
2 * Licensed to the Apache Software Foundation (ASF) under one or more
3 * contributor license agreements. See the NOTICE file distributed with
4 * this work for additional information regarding copyright ownership.
5 * The ASF licenses this file to You under the Apache License, Version 2.0
6 * (the "License"); you may not use this file except in compliance with
7 * the License. You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18package org.apache.commons.math.util;
19
20import java.math.BigDecimal;
21import java.math.BigInteger;
22import java.util.Arrays;
23
24import org.apache.commons.math.MathRuntimeException;
25import org.apache.commons.math.exception.util.Localizable;
26import org.apache.commons.math.exception.util.LocalizedFormats;
27import org.apache.commons.math.exception.NonMonotonousSequenceException;
28
29/**
30 * Some useful additions to the built-in functions in {@link Math}.
31 * @version $Revision: 1073472 $ $Date: 2011-02-22 20:49:07 +0100 (mar. 22 févr. 2011) $
32 */
33public final class MathUtils {
34
35 /** Smallest positive number such that 1 - EPSILON is not numerically equal to 1. */
36 public static final double EPSILON = 0x1.0p-53;
37
38 /** Safe minimum, such that 1 / SAFE_MIN does not overflow.
39 * <p>In IEEE 754 arithmetic, this is also the smallest normalized
40 * number 2<sup>-1022</sup>.</p>
41 */
42 public static final double SAFE_MIN = 0x1.0p-1022;
43
44 /**
45 * 2 &pi;.
46 * @since 2.1
47 */
48 public static final double TWO_PI = 2 * FastMath.PI;
49
50 /** -1.0 cast as a byte. */
51 private static final byte NB = (byte)-1;
52
53 /** -1.0 cast as a short. */
54 private static final short NS = (short)-1;
55
56 /** 1.0 cast as a byte. */
57 private static final byte PB = (byte)1;
58
59 /** 1.0 cast as a short. */
60 private static final short PS = (short)1;
61
62 /** 0.0 cast as a byte. */
63 private static final byte ZB = (byte)0;
64
65 /** 0.0 cast as a short. */
66 private static final short ZS = (short)0;
67
68 /** Gap between NaN and regular numbers. */
69 private static final int NAN_GAP = 4 * 1024 * 1024;
70
71 /** Offset to order signed double numbers lexicographically. */
72 private static final long SGN_MASK = 0x8000000000000000L;
73
74 /** Offset to order signed double numbers lexicographically. */
75 private static final int SGN_MASK_FLOAT = 0x80000000;
76
77 /** All long-representable factorials */
78 private static final long[] FACTORIALS = new long[] {
79 1l, 1l, 2l,
80 6l, 24l, 120l,
81 720l, 5040l, 40320l,
82 362880l, 3628800l, 39916800l,
83 479001600l, 6227020800l, 87178291200l,
84 1307674368000l, 20922789888000l, 355687428096000l,
85 6402373705728000l, 121645100408832000l, 2432902008176640000l };
86
87 /**
88 * Private Constructor
89 */
90 private MathUtils() {
91 super();
92 }
93
94 /**
95 * Add two integers, checking for overflow.
96 *
97 * @param x an addend
98 * @param y an addend
99 * @return the sum <code>x+y</code>
100 * @throws ArithmeticException if the result can not be represented as an
101 * int
102 * @since 1.1
103 */
104 public static int addAndCheck(int x, int y) {
105 long s = (long)x + (long)y;
106 if (s < Integer.MIN_VALUE || s > Integer.MAX_VALUE) {
107 throw MathRuntimeException.createArithmeticException(LocalizedFormats.OVERFLOW_IN_ADDITION, x, y);
108 }
109 return (int)s;
110 }
111
112 /**
113 * Add two long integers, checking for overflow.
114 *
115 * @param a an addend
116 * @param b an addend
117 * @return the sum <code>a+b</code>
118 * @throws ArithmeticException if the result can not be represented as an
119 * long
120 * @since 1.2
121 */
122 public static long addAndCheck(long a, long b) {
123 return addAndCheck(a, b, LocalizedFormats.OVERFLOW_IN_ADDITION);
124 }
125
126 /**
127 * Add two long integers, checking for overflow.
128 *
129 * @param a an addend
130 * @param b an addend
131 * @param pattern the pattern to use for any thrown exception.
132 * @return the sum <code>a+b</code>
133 * @throws ArithmeticException if the result can not be represented as an
134 * long
135 * @since 1.2
136 */
137 private static long addAndCheck(long a, long b, Localizable pattern) {
138 long ret;
139 if (a > b) {
140 // use symmetry to reduce boundary cases
141 ret = addAndCheck(b, a, pattern);
142 } else {
143 // assert a <= b
144
145 if (a < 0) {
146 if (b < 0) {
147 // check for negative overflow
148 if (Long.MIN_VALUE - b <= a) {
149 ret = a + b;
150 } else {
151 throw MathRuntimeException.createArithmeticException(pattern, a, b);
152 }
153 } else {
154 // opposite sign addition is always safe
155 ret = a + b;
156 }
157 } else {
158 // assert a >= 0
159 // assert b >= 0
160
161 // check for positive overflow
162 if (a <= Long.MAX_VALUE - b) {
163 ret = a + b;
164 } else {
165 throw MathRuntimeException.createArithmeticException(pattern, a, b);
166 }
167 }
168 }
169 return ret;
170 }
171
172 /**
173 * Returns an exact representation of the <a
174 * href="http://mathworld.wolfram.com/BinomialCoefficient.html"> Binomial
175 * Coefficient</a>, "<code>n choose k</code>", the number of
176 * <code>k</code>-element subsets that can be selected from an
177 * <code>n</code>-element set.
178 * <p>
179 * <Strong>Preconditions</strong>:
180 * <ul>
181 * <li> <code>0 <= k <= n </code> (otherwise
182 * <code>IllegalArgumentException</code> is thrown)</li>
183 * <li> The result is small enough to fit into a <code>long</code>. The
184 * largest value of <code>n</code> for which all coefficients are
185 * <code> < Long.MAX_VALUE</code> is 66. If the computed value exceeds
186 * <code>Long.MAX_VALUE</code> an <code>ArithMeticException</code> is
187 * thrown.</li>
188 * </ul></p>
189 *
190 * @param n the size of the set
191 * @param k the size of the subsets to be counted
192 * @return <code>n choose k</code>
193 * @throws IllegalArgumentException if preconditions are not met.
194 * @throws ArithmeticException if the result is too large to be represented
195 * by a long integer.
196 */
197 public static long binomialCoefficient(final int n, final int k) {
198 checkBinomial(n, k);
199 if ((n == k) || (k == 0)) {
200 return 1;
201 }
202 if ((k == 1) || (k == n - 1)) {
203 return n;
204 }
205 // Use symmetry for large k
206 if (k > n / 2)
207 return binomialCoefficient(n, n - k);
208
209 // We use the formula
210 // (n choose k) = n! / (n-k)! / k!
211 // (n choose k) == ((n-k+1)*...*n) / (1*...*k)
212 // which could be written
213 // (n choose k) == (n-1 choose k-1) * n / k
214 long result = 1;
215 if (n <= 61) {
216 // For n <= 61, the naive implementation cannot overflow.
217 int i = n - k + 1;
218 for (int j = 1; j <= k; j++) {
219 result = result * i / j;
220 i++;
221 }
222 } else if (n <= 66) {
223 // For n > 61 but n <= 66, the result cannot overflow,
224 // but we must take care not to overflow intermediate values.
225 int i = n - k + 1;
226 for (int j = 1; j <= k; j++) {
227 // We know that (result * i) is divisible by j,
228 // but (result * i) may overflow, so we split j:
229 // Filter out the gcd, d, so j/d and i/d are integer.
230 // result is divisible by (j/d) because (j/d)
231 // is relative prime to (i/d) and is a divisor of
232 // result * (i/d).
233 final long d = gcd(i, j);
234 result = (result / (j / d)) * (i / d);
235 i++;
236 }
237 } else {
238 // For n > 66, a result overflow might occur, so we check
239 // the multiplication, taking care to not overflow
240 // unnecessary.
241 int i = n - k + 1;
242 for (int j = 1; j <= k; j++) {
243 final long d = gcd(i, j);
244 result = mulAndCheck(result / (j / d), i / d);
245 i++;
246 }
247 }
248 return result;
249 }
250
251 /**
252 * Returns a <code>double</code> representation of the <a
253 * href="http://mathworld.wolfram.com/BinomialCoefficient.html"> Binomial
254 * Coefficient</a>, "<code>n choose k</code>", the number of
255 * <code>k</code>-element subsets that can be selected from an
256 * <code>n</code>-element set.
257 * <p>
258 * <Strong>Preconditions</strong>:
259 * <ul>
260 * <li> <code>0 <= k <= n </code> (otherwise
261 * <code>IllegalArgumentException</code> is thrown)</li>
262 * <li> The result is small enough to fit into a <code>double</code>. The
263 * largest value of <code>n</code> for which all coefficients are <
264 * Double.MAX_VALUE is 1029. If the computed value exceeds Double.MAX_VALUE,
265 * Double.POSITIVE_INFINITY is returned</li>
266 * </ul></p>
267 *
268 * @param n the size of the set
269 * @param k the size of the subsets to be counted
270 * @return <code>n choose k</code>
271 * @throws IllegalArgumentException if preconditions are not met.
272 */
273 public static double binomialCoefficientDouble(final int n, final int k) {
274 checkBinomial(n, k);
275 if ((n == k) || (k == 0)) {
276 return 1d;
277 }
278 if ((k == 1) || (k == n - 1)) {
279 return n;
280 }
281 if (k > n/2) {
282 return binomialCoefficientDouble(n, n - k);
283 }
284 if (n < 67) {
285 return binomialCoefficient(n,k);
286 }
287
288 double result = 1d;
289 for (int i = 1; i <= k; i++) {
290 result *= (double)(n - k + i) / (double)i;
291 }
292
293 return FastMath.floor(result + 0.5);
294 }
295
296 /**
297 * Returns the natural <code>log</code> of the <a
298 * href="http://mathworld.wolfram.com/BinomialCoefficient.html"> Binomial
299 * Coefficient</a>, "<code>n choose k</code>", the number of
300 * <code>k</code>-element subsets that can be selected from an
301 * <code>n</code>-element set.
302 * <p>
303 * <Strong>Preconditions</strong>:
304 * <ul>
305 * <li> <code>0 <= k <= n </code> (otherwise
306 * <code>IllegalArgumentException</code> is thrown)</li>
307 * </ul></p>
308 *
309 * @param n the size of the set
310 * @param k the size of the subsets to be counted
311 * @return <code>n choose k</code>
312 * @throws IllegalArgumentException if preconditions are not met.
313 */
314 public static double binomialCoefficientLog(final int n, final int k) {
315 checkBinomial(n, k);
316 if ((n == k) || (k == 0)) {
317 return 0;
318 }
319 if ((k == 1) || (k == n - 1)) {
320 return FastMath.log(n);
321 }
322
323 /*
324 * For values small enough to do exact integer computation,
325 * return the log of the exact value
326 */
327 if (n < 67) {
328 return FastMath.log(binomialCoefficient(n,k));
329 }
330
331 /*
332 * Return the log of binomialCoefficientDouble for values that will not
333 * overflow binomialCoefficientDouble
334 */
335 if (n < 1030) {
336 return FastMath.log(binomialCoefficientDouble(n, k));
337 }
338
339 if (k > n / 2) {
340 return binomialCoefficientLog(n, n - k);
341 }
342
343 /*
344 * Sum logs for values that could overflow
345 */
346 double logSum = 0;
347
348 // n!/(n-k)!
349 for (int i = n - k + 1; i <= n; i++) {
350 logSum += FastMath.log(i);
351 }
352
353 // divide by k!
354 for (int i = 2; i <= k; i++) {
355 logSum -= FastMath.log(i);
356 }
357
358 return logSum;
359 }
360
361 /**
362 * Check binomial preconditions.
363 * @param n the size of the set
364 * @param k the size of the subsets to be counted
365 * @exception IllegalArgumentException if preconditions are not met.
366 */
367 private static void checkBinomial(final int n, final int k)
368 throws IllegalArgumentException {
369 if (n < k) {
370 throw MathRuntimeException.createIllegalArgumentException(
371 LocalizedFormats.BINOMIAL_INVALID_PARAMETERS_ORDER,
372 n, k);
373 }
374 if (n < 0) {
375 throw MathRuntimeException.createIllegalArgumentException(
376 LocalizedFormats.BINOMIAL_NEGATIVE_PARAMETER,
377 n);
378 }
379 }
380
381 /**
382 * Compares two numbers given some amount of allowed error.
383 *
384 * @param x the first number
385 * @param y the second number
386 * @param eps the amount of error to allow when checking for equality
387 * @return <ul><li>0 if {@link #equals(double, double, double) equals(x, y, eps)}</li>
388 * <li>&lt; 0 if !{@link #equals(double, double, double) equals(x, y, eps)} &amp;&amp; x &lt; y</li>
389 * <li>> 0 if !{@link #equals(double, double, double) equals(x, y, eps)} &amp;&amp; x > y</li></ul>
390 */
391 public static int compareTo(double x, double y, double eps) {
392 if (equals(x, y, eps)) {
393 return 0;
394 } else if (x < y) {
395 return -1;
396 }
397 return 1;
398 }
399
400 /**
401 * Returns the <a href="http://mathworld.wolfram.com/HyperbolicCosine.html">
402 * hyperbolic cosine</a> of x.
403 *
404 * @param x double value for which to find the hyperbolic cosine
405 * @return hyperbolic cosine of x
406 */
407 public static double cosh(double x) {
408 return (FastMath.exp(x) + FastMath.exp(-x)) / 2.0;
409 }
410
411 /**
412 * Returns true iff they are strictly equal.
413 *
414 * @param x first value
415 * @param y second value
416 * @return {@code true} if the values are equal.
417 * @deprecated as of 2.2 his method considers that {@code NaN == NaN}. In release
418 * 3.0, the semantics will change in order to comply with IEEE754 where it
419 * is specified that {@code NaN != NaN}.
420 * New methods have been added for those cases wher the old semantics is
421 * useful (see e.g. {@link #equalsIncludingNaN(float,float)
422 * equalsIncludingNaN}.
423 */
424 @Deprecated
425 public static boolean equals(float x, float y) {
426 return (Float.isNaN(x) && Float.isNaN(y)) || x == y;
427 }
428
429 /**
430 * Returns true if both arguments are NaN or neither is NaN and they are
431 * equal as defined by {@link #equals(float,float,int) equals(x, y, 1)}.
432 *
433 * @param x first value
434 * @param y second value
435 * @return {@code true} if the values are equal or both are NaN.
436 * @since 2.2
437 */
438 public static boolean equalsIncludingNaN(float x, float y) {
439 return (Float.isNaN(x) && Float.isNaN(y)) || equals(x, y, 1);
440 }
441
442 /**
443 * Returns true if both arguments are equal or within the range of allowed
444 * error (inclusive).
445 *
446 * @param x first value
447 * @param y second value
448 * @param eps the amount of absolute error to allow.
449 * @return {@code true} if the values are equal or within range of each other.
450 * @since 2.2
451 */
452 public static boolean equals(float x, float y, float eps) {
453 return equals(x, y, 1) || FastMath.abs(y - x) <= eps;
454 }
455
456 /**
457 * Returns true if both arguments are NaN or are equal or within the range
458 * of allowed error (inclusive).
459 *
460 * @param x first value
461 * @param y second value
462 * @param eps the amount of absolute error to allow.
463 * @return {@code true} if the values are equal or within range of each other,
464 * or both are NaN.
465 * @since 2.2
466 */
467 public static boolean equalsIncludingNaN(float x, float y, float eps) {
468 return equalsIncludingNaN(x, y) || (FastMath.abs(y - x) <= eps);
469 }
470
471 /**
472 * Returns true if both arguments are equal or within the range of allowed
473 * error (inclusive).
474 * Two float numbers are considered equal if there are {@code (maxUlps - 1)}
475 * (or fewer) floating point numbers between them, i.e. two adjacent floating
476 * point numbers are considered equal.
477 * Adapted from <a
478 * href="http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm">
479 * Bruce Dawson</a>
480 *
481 * @param x first value
482 * @param y second value
483 * @param maxUlps {@code (maxUlps - 1)} is the number of floating point
484 * values between {@code x} and {@code y}.
485 * @return {@code true} if there are fewer than {@code maxUlps} floating
486 * point values between {@code x} and {@code y}.
487 * @since 2.2
488 */
489 public static boolean equals(float x, float y, int maxUlps) {
490 // Check that "maxUlps" is non-negative and small enough so that
491 // NaN won't compare as equal to anything (except another NaN).
492 assert maxUlps > 0 && maxUlps < NAN_GAP;
493
494 int xInt = Float.floatToIntBits(x);
495 int yInt = Float.floatToIntBits(y);
496
497 // Make lexicographically ordered as a two's-complement integer.
498 if (xInt < 0) {
499 xInt = SGN_MASK_FLOAT - xInt;
500 }
501 if (yInt < 0) {
502 yInt = SGN_MASK_FLOAT - yInt;
503 }
504
505 final boolean isEqual = FastMath.abs(xInt - yInt) <= maxUlps;
506
507 return isEqual && !Float.isNaN(x) && !Float.isNaN(y);
508 }
509
510 /**
511 * Returns true if both arguments are NaN or if they are equal as defined
512 * by {@link #equals(float,float,int) equals(x, y, maxUlps)}.
513 *
514 * @param x first value
515 * @param y second value
516 * @param maxUlps {@code (maxUlps - 1)} is the number of floating point
517 * values between {@code x} and {@code y}.
518 * @return {@code true} if both arguments are NaN or if there are less than
519 * {@code maxUlps} floating point values between {@code x} and {@code y}.
520 * @since 2.2
521 */
522 public static boolean equalsIncludingNaN(float x, float y, int maxUlps) {
523 return (Float.isNaN(x) && Float.isNaN(y)) || equals(x, y, maxUlps);
524 }
525
526 /**
527 * Returns true iff both arguments are null or have same dimensions and all
528 * their elements are equal as defined by
529 * {@link #equals(float,float)}.
530 *
531 * @param x first array
532 * @param y second array
533 * @return true if the values are both null or have same dimension
534 * and equal elements.
535 * @deprecated as of 2.2 this method considers that {@code NaN == NaN}. In release
536 * 3.0, the semantics will change in order to comply with IEEE754 where it
537 * is specified that {@code NaN != NaN}.
538 * New methods have been added for those cases where the old semantics is
539 * useful (see e.g. {@link #equalsIncludingNaN(float[],float[])
540 * equalsIncludingNaN}.
541 */
542 @Deprecated
543 public static boolean equals(float[] x, float[] y) {
544 if ((x == null) || (y == null)) {
545 return !((x == null) ^ (y == null));
546 }
547 if (x.length != y.length) {
548 return false;
549 }
550 for (int i = 0; i < x.length; ++i) {
551 if (!equals(x[i], y[i])) {
552 return false;
553 }
554 }
555 return true;
556 }
557
558 /**
559 * Returns true iff both arguments are null or have same dimensions and all
560 * their elements are equal as defined by
561 * {@link #equalsIncludingNaN(float,float)}.
562 *
563 * @param x first array
564 * @param y second array
565 * @return true if the values are both null or have same dimension and
566 * equal elements
567 * @since 2.2
568 */
569 public static boolean equalsIncludingNaN(float[] x, float[] y) {
570 if ((x == null) || (y == null)) {
571 return !((x == null) ^ (y == null));
572 }
573 if (x.length != y.length) {
574 return false;
575 }
576 for (int i = 0; i < x.length; ++i) {
577 if (!equalsIncludingNaN(x[i], y[i])) {
578 return false;
579 }
580 }
581 return true;
582 }
583
584 /**
585 * Returns true iff both arguments are NaN or neither is NaN and they are
586 * equal
587 *
588 * <p>This method considers that {@code NaN == NaN}. In release
589 * 3.0, the semantics will change in order to comply with IEEE754 where it
590 * is specified that {@code NaN != NaN}.
591 * New methods have been added for those cases where the old semantics
592 * (w.r.t. NaN) is useful (see e.g.
593 * {@link #equalsIncludingNaN(double,double, double) equalsIncludingNaN}.
594 * </p>
595 *
596 * @param x first value
597 * @param y second value
598 * @return {@code true} if the values are equal.
599 */
600 public static boolean equals(double x, double y) {
601 return (Double.isNaN(x) && Double.isNaN(y)) || x == y;
602 }
603
604 /**
605 * Returns true if both arguments are NaN or neither is NaN and they are
606 * equal as defined by {@link #equals(double,double,int) equals(x, y, 1)}.
607 *
608 * @param x first value
609 * @param y second value
610 * @return {@code true} if the values are equal or both are NaN.
611 * @since 2.2
612 */
613 public static boolean equalsIncludingNaN(double x, double y) {
614 return (Double.isNaN(x) && Double.isNaN(y)) || equals(x, y, 1);
615 }
616
617 /**
618 * Returns true if both arguments are equal or within the range of allowed
619 * error (inclusive).
620 * <p>
621 * Two NaNs are considered equals, as are two infinities with same sign.
622 * </p>
623 * <p>This method considers that {@code NaN == NaN}. In release
624 * 3.0, the semantics will change in order to comply with IEEE754 where it
625 * is specified that {@code NaN != NaN}.
626 * New methods have been added for those cases where the old semantics
627 * (w.r.t. NaN) is useful (see e.g.
628 * {@link #equalsIncludingNaN(double,double, double) equalsIncludingNaN}.
629 * </p>
630 * @param x first value
631 * @param y second value
632 * @param eps the amount of absolute error to allow.
633 * @return {@code true} if the values are equal or within range of each other.
634 */
635 public static boolean equals(double x, double y, double eps) {
636 return equals(x, y) || FastMath.abs(y - x) <= eps;
637 }
638
639 /**
640 * Returns true if both arguments are NaN or are equal or within the range
641 * of allowed error (inclusive).
642 *
643 * @param x first value
644 * @param y second value
645 * @param eps the amount of absolute error to allow.
646 * @return {@code true} if the values are equal or within range of each other,
647 * or both are NaN.
648 * @since 2.2
649 */
650 public static boolean equalsIncludingNaN(double x, double y, double eps) {
651 return equalsIncludingNaN(x, y) || (FastMath.abs(y - x) <= eps);
652 }
653
654 /**
655 * Returns true if both arguments are equal or within the range of allowed
656 * error (inclusive).
657 * Two float numbers are considered equal if there are {@code (maxUlps - 1)}
658 * (or fewer) floating point numbers between them, i.e. two adjacent floating
659 * point numbers are considered equal.
660 * Adapted from <a
661 * href="http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm">
662 * Bruce Dawson</a>
663 *
664 * <p>This method considers that {@code NaN == NaN}. In release
665 * 3.0, the semantics will change in order to comply with IEEE754 where it
666 * is specified that {@code NaN != NaN}.
667 * New methods have been added for those cases where the old semantics
668 * (w.r.t. NaN) is useful (see e.g.
669 * {@link #equalsIncludingNaN(double,double, int) equalsIncludingNaN}.
670 * </p>
671 *
672 * @param x first value
673 * @param y second value
674 * @param maxUlps {@code (maxUlps - 1)} is the number of floating point
675 * values between {@code x} and {@code y}.
676 * @return {@code true} if there are fewer than {@code maxUlps} floating
677 * point values between {@code x} and {@code y}.
678 */
679 public static boolean equals(double x, double y, int maxUlps) {
680 // Check that "maxUlps" is non-negative and small enough so that
681 // NaN won't compare as equal to anything (except another NaN).
682 assert maxUlps > 0 && maxUlps < NAN_GAP;
683
684 long xInt = Double.doubleToLongBits(x);
685 long yInt = Double.doubleToLongBits(y);
686
687 // Make lexicographically ordered as a two's-complement integer.
688 if (xInt < 0) {
689 xInt = SGN_MASK - xInt;
690 }
691 if (yInt < 0) {
692 yInt = SGN_MASK - yInt;
693 }
694
695 return FastMath.abs(xInt - yInt) <= maxUlps;
696 }
697
698 /**
699 * Returns true if both arguments are NaN or if they are equal as defined
700 * by {@link #equals(double,double,int) equals(x, y, maxUlps}.
701 *
702 * @param x first value
703 * @param y second value
704 * @param maxUlps {@code (maxUlps - 1)} is the number of floating point
705 * values between {@code x} and {@code y}.
706 * @return {@code true} if both arguments are NaN or if there are less than
707 * {@code maxUlps} floating point values between {@code x} and {@code y}.
708 * @since 2.2
709 */
710 public static boolean equalsIncludingNaN(double x, double y, int maxUlps) {
711 return (Double.isNaN(x) && Double.isNaN(y)) || equals(x, y, maxUlps);
712 }
713
714 /**
715 * Returns true iff both arguments are null or have same dimensions and all
716 * their elements are equal as defined by
717 * {@link #equals(double,double)}.
718 *
719 * <p>This method considers that {@code NaN == NaN}. In release
720 * 3.0, the semantics will change in order to comply with IEEE754 where it
721 * is specified that {@code NaN != NaN}.
722 * New methods have been added for those cases wher the old semantics is
723 * useful (see e.g. {@link #equalsIncludingNaN(double[],double[])
724 * equalsIncludingNaN}.
725 * </p>
726 * @param x first array
727 * @param y second array
728 * @return true if the values are both null or have same dimension
729 * and equal elements.
730 */
731 public static boolean equals(double[] x, double[] y) {
732 if ((x == null) || (y == null)) {
733 return !((x == null) ^ (y == null));
734 }
735 if (x.length != y.length) {
736 return false;
737 }
738 for (int i = 0; i < x.length; ++i) {
739 if (!equals(x[i], y[i])) {
740 return false;
741 }
742 }
743 return true;
744 }
745
746 /**
747 * Returns true iff both arguments are null or have same dimensions and all
748 * their elements are equal as defined by
749 * {@link #equalsIncludingNaN(double,double)}.
750 *
751 * @param x first array
752 * @param y second array
753 * @return true if the values are both null or have same dimension and
754 * equal elements
755 * @since 2.2
756 */
757 public static boolean equalsIncludingNaN(double[] x, double[] y) {
758 if ((x == null) || (y == null)) {
759 return !((x == null) ^ (y == null));
760 }
761 if (x.length != y.length) {
762 return false;
763 }
764 for (int i = 0; i < x.length; ++i) {
765 if (!equalsIncludingNaN(x[i], y[i])) {
766 return false;
767 }
768 }
769 return true;
770 }
771
772 /**
773 * Returns n!. Shorthand for <code>n</code> <a
774 * href="http://mathworld.wolfram.com/Factorial.html"> Factorial</a>, the
775 * product of the numbers <code>1,...,n</code>.
776 * <p>
777 * <Strong>Preconditions</strong>:
778 * <ul>
779 * <li> <code>n >= 0</code> (otherwise
780 * <code>IllegalArgumentException</code> is thrown)</li>
781 * <li> The result is small enough to fit into a <code>long</code>. The
782 * largest value of <code>n</code> for which <code>n!</code> <
783 * Long.MAX_VALUE</code> is 20. If the computed value exceeds <code>Long.MAX_VALUE</code>
784 * an <code>ArithMeticException </code> is thrown.</li>
785 * </ul>
786 * </p>
787 *
788 * @param n argument
789 * @return <code>n!</code>
790 * @throws ArithmeticException if the result is too large to be represented
791 * by a long integer.
792 * @throws IllegalArgumentException if n < 0
793 */
794 public static long factorial(final int n) {
795 if (n < 0) {
796 throw MathRuntimeException.createIllegalArgumentException(
797 LocalizedFormats.FACTORIAL_NEGATIVE_PARAMETER,
798 n);
799 }
800 if (n > 20) {
801 throw new ArithmeticException(
802 "factorial value is too large to fit in a long");
803 }
804 return FACTORIALS[n];
805 }
806
807 /**
808 * Returns n!. Shorthand for <code>n</code> <a
809 * href="http://mathworld.wolfram.com/Factorial.html"> Factorial</a>, the
810 * product of the numbers <code>1,...,n</code> as a <code>double</code>.
811 * <p>
812 * <Strong>Preconditions</strong>:
813 * <ul>
814 * <li> <code>n >= 0</code> (otherwise
815 * <code>IllegalArgumentException</code> is thrown)</li>
816 * <li> The result is small enough to fit into a <code>double</code>. The
817 * largest value of <code>n</code> for which <code>n!</code> <
818 * Double.MAX_VALUE</code> is 170. If the computed value exceeds
819 * Double.MAX_VALUE, Double.POSITIVE_INFINITY is returned</li>
820 * </ul>
821 * </p>
822 *
823 * @param n argument
824 * @return <code>n!</code>
825 * @throws IllegalArgumentException if n < 0
826 */
827 public static double factorialDouble(final int n) {
828 if (n < 0) {
829 throw MathRuntimeException.createIllegalArgumentException(
830 LocalizedFormats.FACTORIAL_NEGATIVE_PARAMETER,
831 n);
832 }
833 if (n < 21) {
834 return factorial(n);
835 }
836 return FastMath.floor(FastMath.exp(factorialLog(n)) + 0.5);
837 }
838
839 /**
840 * Returns the natural logarithm of n!.
841 * <p>
842 * <Strong>Preconditions</strong>:
843 * <ul>
844 * <li> <code>n >= 0</code> (otherwise
845 * <code>IllegalArgumentException</code> is thrown)</li>
846 * </ul></p>
847 *
848 * @param n argument
849 * @return <code>n!</code>
850 * @throws IllegalArgumentException if preconditions are not met.
851 */
852 public static double factorialLog(final int n) {
853 if (n < 0) {
854 throw MathRuntimeException.createIllegalArgumentException(
855 LocalizedFormats.FACTORIAL_NEGATIVE_PARAMETER,
856 n);
857 }
858 if (n < 21) {
859 return FastMath.log(factorial(n));
860 }
861 double logSum = 0;
862 for (int i = 2; i <= n; i++) {
863 logSum += FastMath.log(i);
864 }
865 return logSum;
866 }
867
868 /**
869 * <p>
870 * Gets the greatest common divisor of the absolute value of two numbers,
871 * using the "binary gcd" method which avoids division and modulo
872 * operations. See Knuth 4.5.2 algorithm B. This algorithm is due to Josef
873 * Stein (1961).
874 * </p>
875 * Special cases:
876 * <ul>
877 * <li>The invocations
878 * <code>gcd(Integer.MIN_VALUE, Integer.MIN_VALUE)</code>,
879 * <code>gcd(Integer.MIN_VALUE, 0)</code> and
880 * <code>gcd(0, Integer.MIN_VALUE)</code> throw an
881 * <code>ArithmeticException</code>, because the result would be 2^31, which
882 * is too large for an int value.</li>
883 * <li>The result of <code>gcd(x, x)</code>, <code>gcd(0, x)</code> and
884 * <code>gcd(x, 0)</code> is the absolute value of <code>x</code>, except
885 * for the special cases above.
886 * <li>The invocation <code>gcd(0, 0)</code> is the only one which returns
887 * <code>0</code>.</li>
888 * </ul>
889 *
890 * @param p any number
891 * @param q any number
892 * @return the greatest common divisor, never negative
893 * @throws ArithmeticException if the result cannot be represented as a
894 * nonnegative int value
895 * @since 1.1
896 */
897 public static int gcd(final int p, final int q) {
898 int u = p;
899 int v = q;
900 if ((u == 0) || (v == 0)) {
901 if ((u == Integer.MIN_VALUE) || (v == Integer.MIN_VALUE)) {
902 throw MathRuntimeException.createArithmeticException(
903 LocalizedFormats.GCD_OVERFLOW_32_BITS,
904 p, q);
905 }
906 return FastMath.abs(u) + FastMath.abs(v);
907 }
908 // keep u and v negative, as negative integers range down to
909 // -2^31, while positive numbers can only be as large as 2^31-1
910 // (i.e. we can't necessarily negate a negative number without
911 // overflow)
912 /* assert u!=0 && v!=0; */
913 if (u > 0) {
914 u = -u;
915 } // make u negative
916 if (v > 0) {
917 v = -v;
918 } // make v negative
919 // B1. [Find power of 2]
920 int k = 0;
921 while ((u & 1) == 0 && (v & 1) == 0 && k < 31) { // while u and v are
922 // both even...
923 u /= 2;
924 v /= 2;
925 k++; // cast out twos.
926 }
927 if (k == 31) {
928 throw MathRuntimeException.createArithmeticException(
929 LocalizedFormats.GCD_OVERFLOW_32_BITS,
930 p, q);
931 }
932 // B2. Initialize: u and v have been divided by 2^k and at least
933 // one is odd.
934 int t = ((u & 1) == 1) ? v : -(u / 2)/* B3 */;
935 // t negative: u was odd, v may be even (t replaces v)
936 // t positive: u was even, v is odd (t replaces u)
937 do {
938 /* assert u<0 && v<0; */
939 // B4/B3: cast out twos from t.
940 while ((t & 1) == 0) { // while t is even..
941 t /= 2; // cast out twos
942 }
943 // B5 [reset max(u,v)]
944 if (t > 0) {
945 u = -t;
946 } else {
947 v = t;
948 }
949 // B6/B3. at this point both u and v should be odd.
950 t = (v - u) / 2;
951 // |u| larger: t positive (replace u)
952 // |v| larger: t negative (replace v)
953 } while (t != 0);
954 return -u * (1 << k); // gcd is u*2^k
955 }
956
957 /**
958 * <p>
959 * Gets the greatest common divisor of the absolute value of two numbers,
960 * using the "binary gcd" method which avoids division and modulo
961 * operations. See Knuth 4.5.2 algorithm B. This algorithm is due to Josef
962 * Stein (1961).
963 * </p>
964 * Special cases:
965 * <ul>
966 * <li>The invocations
967 * <code>gcd(Long.MIN_VALUE, Long.MIN_VALUE)</code>,
968 * <code>gcd(Long.MIN_VALUE, 0L)</code> and
969 * <code>gcd(0L, Long.MIN_VALUE)</code> throw an
970 * <code>ArithmeticException</code>, because the result would be 2^63, which
971 * is too large for a long value.</li>
972 * <li>The result of <code>gcd(x, x)</code>, <code>gcd(0L, x)</code> and
973 * <code>gcd(x, 0L)</code> is the absolute value of <code>x</code>, except
974 * for the special cases above.
975 * <li>The invocation <code>gcd(0L, 0L)</code> is the only one which returns
976 * <code>0L</code>.</li>
977 * </ul>
978 *
979 * @param p any number
980 * @param q any number
981 * @return the greatest common divisor, never negative
982 * @throws ArithmeticException if the result cannot be represented as a nonnegative long
983 * value
984 * @since 2.1
985 */
986 public static long gcd(final long p, final long q) {
987 long u = p;
988 long v = q;
989 if ((u == 0) || (v == 0)) {
990 if ((u == Long.MIN_VALUE) || (v == Long.MIN_VALUE)){
991 throw MathRuntimeException.createArithmeticException(
992 LocalizedFormats.GCD_OVERFLOW_64_BITS,
993 p, q);
994 }
995 return FastMath.abs(u) + FastMath.abs(v);
996 }
997 // keep u and v negative, as negative integers range down to
998 // -2^63, while positive numbers can only be as large as 2^63-1
999 // (i.e. we can't necessarily negate a negative number without
1000 // overflow)
1001 /* assert u!=0 && v!=0; */
1002 if (u > 0) {
1003 u = -u;
1004 } // make u negative
1005 if (v > 0) {
1006 v = -v;
1007 } // make v negative
1008 // B1. [Find power of 2]
1009 int k = 0;
1010 while ((u & 1) == 0 && (v & 1) == 0 && k < 63) { // while u and v are
1011 // both even...
1012 u /= 2;
1013 v /= 2;
1014 k++; // cast out twos.
1015 }
1016 if (k == 63) {
1017 throw MathRuntimeException.createArithmeticException(
1018 LocalizedFormats.GCD_OVERFLOW_64_BITS,
1019 p, q);
1020 }
1021 // B2. Initialize: u and v have been divided by 2^k and at least
1022 // one is odd.
1023 long t = ((u & 1) == 1) ? v : -(u / 2)/* B3 */;
1024 // t negative: u was odd, v may be even (t replaces v)
1025 // t positive: u was even, v is odd (t replaces u)
1026 do {
1027 /* assert u<0 && v<0; */
1028 // B4/B3: cast out twos from t.
1029 while ((t & 1) == 0) { // while t is even..
1030 t /= 2; // cast out twos
1031 }
1032 // B5 [reset max(u,v)]
1033 if (t > 0) {
1034 u = -t;
1035 } else {
1036 v = t;
1037 }
1038 // B6/B3. at this point both u and v should be odd.
1039 t = (v - u) / 2;
1040 // |u| larger: t positive (replace u)
1041 // |v| larger: t negative (replace v)
1042 } while (t != 0);
1043 return -u * (1L << k); // gcd is u*2^k
1044 }
1045
1046 /**
1047 * Returns an integer hash code representing the given double value.
1048 *
1049 * @param value the value to be hashed
1050 * @return the hash code
1051 */
1052 public static int hash(double value) {
1053 return new Double(value).hashCode();
1054 }
1055
1056 /**
1057 * Returns an integer hash code representing the given double array.
1058 *
1059 * @param value the value to be hashed (may be null)
1060 * @return the hash code
1061 * @since 1.2
1062 */
1063 public static int hash(double[] value) {
1064 return Arrays.hashCode(value);
1065 }
1066
1067 /**
1068 * For a byte value x, this method returns (byte)(+1) if x >= 0 and
1069 * (byte)(-1) if x < 0.
1070 *
1071 * @param x the value, a byte
1072 * @return (byte)(+1) or (byte)(-1), depending on the sign of x
1073 */
1074 public static byte indicator(final byte x) {
1075 return (x >= ZB) ? PB : NB;
1076 }
1077
1078 /**
1079 * For a double precision value x, this method returns +1.0 if x >= 0 and
1080 * -1.0 if x < 0. Returns <code>NaN</code> if <code>x</code> is
1081 * <code>NaN</code>.
1082 *
1083 * @param x the value, a double
1084 * @return +1.0 or -1.0, depending on the sign of x
1085 */
1086 public static double indicator(final double x) {
1087 if (Double.isNaN(x)) {
1088 return Double.NaN;
1089 }
1090 return (x >= 0.0) ? 1.0 : -1.0;
1091 }
1092
1093 /**
1094 * For a float value x, this method returns +1.0F if x >= 0 and -1.0F if x <
1095 * 0. Returns <code>NaN</code> if <code>x</code> is <code>NaN</code>.
1096 *
1097 * @param x the value, a float
1098 * @return +1.0F or -1.0F, depending on the sign of x
1099 */
1100 public static float indicator(final float x) {
1101 if (Float.isNaN(x)) {
1102 return Float.NaN;
1103 }
1104 return (x >= 0.0F) ? 1.0F : -1.0F;
1105 }
1106
1107 /**
1108 * For an int value x, this method returns +1 if x >= 0 and -1 if x < 0.
1109 *
1110 * @param x the value, an int
1111 * @return +1 or -1, depending on the sign of x
1112 */
1113 public static int indicator(final int x) {
1114 return (x >= 0) ? 1 : -1;
1115 }
1116
1117 /**
1118 * For a long value x, this method returns +1L if x >= 0 and -1L if x < 0.
1119 *
1120 * @param x the value, a long
1121 * @return +1L or -1L, depending on the sign of x
1122 */
1123 public static long indicator(final long x) {
1124 return (x >= 0L) ? 1L : -1L;
1125 }
1126
1127 /**
1128 * For a short value x, this method returns (short)(+1) if x >= 0 and
1129 * (short)(-1) if x < 0.
1130 *
1131 * @param x the value, a short
1132 * @return (short)(+1) or (short)(-1), depending on the sign of x
1133 */
1134 public static short indicator(final short x) {
1135 return (x >= ZS) ? PS : NS;
1136 }
1137
1138 /**
1139 * <p>
1140 * Returns the least common multiple of the absolute value of two numbers,
1141 * using the formula <code>lcm(a,b) = (a / gcd(a,b)) * b</code>.
1142 * </p>
1143 * Special cases:
1144 * <ul>
1145 * <li>The invocations <code>lcm(Integer.MIN_VALUE, n)</code> and
1146 * <code>lcm(n, Integer.MIN_VALUE)</code>, where <code>abs(n)</code> is a
1147 * power of 2, throw an <code>ArithmeticException</code>, because the result
1148 * would be 2^31, which is too large for an int value.</li>
1149 * <li>The result of <code>lcm(0, x)</code> and <code>lcm(x, 0)</code> is
1150 * <code>0</code> for any <code>x</code>.
1151 * </ul>
1152 *
1153 * @param a any number
1154 * @param b any number
1155 * @return the least common multiple, never negative
1156 * @throws ArithmeticException
1157 * if the result cannot be represented as a nonnegative int
1158 * value
1159 * @since 1.1
1160 */
1161 public static int lcm(int a, int b) {
1162 if (a==0 || b==0){
1163 return 0;
1164 }
1165 int lcm = FastMath.abs(mulAndCheck(a / gcd(a, b), b));
1166 if (lcm == Integer.MIN_VALUE) {
1167 throw MathRuntimeException.createArithmeticException(
1168 LocalizedFormats.LCM_OVERFLOW_32_BITS,
1169 a, b);
1170 }
1171 return lcm;
1172 }
1173
1174 /**
1175 * <p>
1176 * Returns the least common multiple of the absolute value of two numbers,
1177 * using the formula <code>lcm(a,b) = (a / gcd(a,b)) * b</code>.
1178 * </p>
1179 * Special cases:
1180 * <ul>
1181 * <li>The invocations <code>lcm(Long.MIN_VALUE, n)</code> and
1182 * <code>lcm(n, Long.MIN_VALUE)</code>, where <code>abs(n)</code> is a
1183 * power of 2, throw an <code>ArithmeticException</code>, because the result
1184 * would be 2^63, which is too large for an int value.</li>
1185 * <li>The result of <code>lcm(0L, x)</code> and <code>lcm(x, 0L)</code> is
1186 * <code>0L</code> for any <code>x</code>.
1187 * </ul>
1188 *
1189 * @param a any number
1190 * @param b any number
1191 * @return the least common multiple, never negative
1192 * @throws ArithmeticException if the result cannot be represented as a nonnegative long
1193 * value
1194 * @since 2.1
1195 */
1196 public static long lcm(long a, long b) {
1197 if (a==0 || b==0){
1198 return 0;
1199 }
1200 long lcm = FastMath.abs(mulAndCheck(a / gcd(a, b), b));
1201 if (lcm == Long.MIN_VALUE){
1202 throw MathRuntimeException.createArithmeticException(
1203 LocalizedFormats.LCM_OVERFLOW_64_BITS,
1204 a, b);
1205 }
1206 return lcm;
1207 }
1208
1209 /**
1210 * <p>Returns the
1211 * <a href="http://mathworld.wolfram.com/Logarithm.html">logarithm</a>
1212 * for base <code>b</code> of <code>x</code>.
1213 * </p>
1214 * <p>Returns <code>NaN<code> if either argument is negative. If
1215 * <code>base</code> is 0 and <code>x</code> is positive, 0 is returned.
1216 * If <code>base</code> is positive and <code>x</code> is 0,
1217 * <code>Double.NEGATIVE_INFINITY</code> is returned. If both arguments
1218 * are 0, the result is <code>NaN</code>.</p>
1219 *
1220 * @param base the base of the logarithm, must be greater than 0
1221 * @param x argument, must be greater than 0
1222 * @return the value of the logarithm - the number y such that base^y = x.
1223 * @since 1.2
1224 */
1225 public static double log(double base, double x) {
1226 return FastMath.log(x)/FastMath.log(base);
1227 }
1228
1229 /**
1230 * Multiply two integers, checking for overflow.
1231 *
1232 * @param x a factor
1233 * @param y a factor
1234 * @return the product <code>x*y</code>
1235 * @throws ArithmeticException if the result can not be represented as an
1236 * int
1237 * @since 1.1
1238 */
1239 public static int mulAndCheck(int x, int y) {
1240 long m = ((long)x) * ((long)y);
1241 if (m < Integer.MIN_VALUE || m > Integer.MAX_VALUE) {
1242 throw new ArithmeticException("overflow: mul");
1243 }
1244 return (int)m;
1245 }
1246
1247 /**
1248 * Multiply two long integers, checking for overflow.
1249 *
1250 * @param a first value
1251 * @param b second value
1252 * @return the product <code>a * b</code>
1253 * @throws ArithmeticException if the result can not be represented as an
1254 * long
1255 * @since 1.2
1256 */
1257 public static long mulAndCheck(long a, long b) {
1258 long ret;
1259 String msg = "overflow: multiply";
1260 if (a > b) {
1261 // use symmetry to reduce boundary cases
1262 ret = mulAndCheck(b, a);
1263 } else {
1264 if (a < 0) {
1265 if (b < 0) {
1266 // check for positive overflow with negative a, negative b
1267 if (a >= Long.MAX_VALUE / b) {
1268 ret = a * b;
1269 } else {
1270 throw new ArithmeticException(msg);
1271 }
1272 } else if (b > 0) {
1273 // check for negative overflow with negative a, positive b
1274 if (Long.MIN_VALUE / b <= a) {
1275 ret = a * b;
1276 } else {
1277 throw new ArithmeticException(msg);
1278
1279 }
1280 } else {
1281 // assert b == 0
1282 ret = 0;
1283 }
1284 } else if (a > 0) {
1285 // assert a > 0
1286 // assert b > 0
1287
1288 // check for positive overflow with positive a, positive b
1289 if (a <= Long.MAX_VALUE / b) {
1290 ret = a * b;
1291 } else {
1292 throw new ArithmeticException(msg);
1293 }
1294 } else {
1295 // assert a == 0
1296 ret = 0;
1297 }
1298 }
1299 return ret;
1300 }
1301
1302 /**
1303 * Get the next machine representable number after a number, moving
1304 * in the direction of another number.
1305 * <p>
1306 * If <code>direction</code> is greater than or equal to<code>d</code>,
1307 * the smallest machine representable number strictly greater than
1308 * <code>d</code> is returned; otherwise the largest representable number
1309 * strictly less than <code>d</code> is returned.</p>
1310 * <p>
1311 * If <code>d</code> is NaN or Infinite, it is returned unchanged.</p>
1312 *
1313 * @param d base number
1314 * @param direction (the only important thing is whether
1315 * direction is greater or smaller than d)
1316 * @return the next machine representable number in the specified direction
1317 * @since 1.2
1318 * @deprecated as of 2.2, replaced by {@link FastMath#nextAfter(double, double)}
1319 * which handles Infinities differently, and returns direction if d and direction compare equal.
1320 */
1321 @Deprecated
1322 public static double nextAfter(double d, double direction) {
1323
1324 // handling of some important special cases
1325 if (Double.isNaN(d) || Double.isInfinite(d)) {
1326 return d;
1327 } else if (d == 0) {
1328 return (direction < 0) ? -Double.MIN_VALUE : Double.MIN_VALUE;
1329 }
1330 // special cases MAX_VALUE to infinity and MIN_VALUE to 0
1331 // are handled just as normal numbers
1332
1333 // split the double in raw components
1334 long bits = Double.doubleToLongBits(d);
1335 long sign = bits & 0x8000000000000000L;
1336 long exponent = bits & 0x7ff0000000000000L;
1337 long mantissa = bits & 0x000fffffffffffffL;
1338
1339 if (d * (direction - d) >= 0) {
1340 // we should increase the mantissa
1341 if (mantissa == 0x000fffffffffffffL) {
1342 return Double.longBitsToDouble(sign |
1343 (exponent + 0x0010000000000000L));
1344 } else {
1345 return Double.longBitsToDouble(sign |
1346 exponent | (mantissa + 1));
1347 }
1348 } else {
1349 // we should decrease the mantissa
1350 if (mantissa == 0L) {
1351 return Double.longBitsToDouble(sign |
1352 (exponent - 0x0010000000000000L) |
1353 0x000fffffffffffffL);
1354 } else {
1355 return Double.longBitsToDouble(sign |
1356 exponent | (mantissa - 1));
1357 }
1358 }
1359 }
1360
1361 /**
1362 * Scale a number by 2<sup>scaleFactor</sup>.
1363 * <p>If <code>d</code> is 0 or NaN or Infinite, it is returned unchanged.</p>
1364 *
1365 * @param d base number
1366 * @param scaleFactor power of two by which d should be multiplied
1367 * @return d &times; 2<sup>scaleFactor</sup>
1368 * @since 2.0
1369 * @deprecated as of 2.2, replaced by {@link FastMath#scalb(double, int)}
1370 */
1371 @Deprecated
1372 public static double scalb(final double d, final int scaleFactor) {
1373 return FastMath.scalb(d, scaleFactor);
1374 }
1375
1376 /**
1377 * Normalize an angle in a 2&pi wide interval around a center value.
1378 * <p>This method has three main uses:</p>
1379 * <ul>
1380 * <li>normalize an angle between 0 and 2&pi;:<br/>
1381 * <code>a = MathUtils.normalizeAngle(a, FastMath.PI);</code></li>
1382 * <li>normalize an angle between -&pi; and +&pi;<br/>
1383 * <code>a = MathUtils.normalizeAngle(a, 0.0);</code></li>
1384 * <li>compute the angle between two defining angular positions:<br>
1385 * <code>angle = MathUtils.normalizeAngle(end, start) - start;</code></li>
1386 * </ul>
1387 * <p>Note that due to numerical accuracy and since &pi; cannot be represented
1388 * exactly, the result interval is <em>closed</em>, it cannot be half-closed
1389 * as would be more satisfactory in a purely mathematical view.</p>
1390 * @param a angle to normalize
1391 * @param center center of the desired 2&pi; interval for the result
1392 * @return a-2k&pi; with integer k and center-&pi; &lt;= a-2k&pi; &lt;= center+&pi;
1393 * @since 1.2
1394 */
1395 public static double normalizeAngle(double a, double center) {
1396 return a - TWO_PI * FastMath.floor((a + FastMath.PI - center) / TWO_PI);
1397 }
1398
1399 /**
1400 * <p>Normalizes an array to make it sum to a specified value.
1401 * Returns the result of the transformation <pre>
1402 * x |-> x * normalizedSum / sum
1403 * </pre>
1404 * applied to each non-NaN element x of the input array, where sum is the
1405 * sum of the non-NaN entries in the input array.</p>
1406 *
1407 * <p>Throws IllegalArgumentException if <code>normalizedSum</code> is infinite
1408 * or NaN and ArithmeticException if the input array contains any infinite elements
1409 * or sums to 0</p>
1410 *
1411 * <p>Ignores (i.e., copies unchanged to the output array) NaNs in the input array.</p>
1412 *
1413 * @param values input array to be normalized
1414 * @param normalizedSum target sum for the normalized array
1415 * @return normalized array
1416 * @throws ArithmeticException if the input array contains infinite elements or sums to zero
1417 * @throws IllegalArgumentException if the target sum is infinite or NaN
1418 * @since 2.1
1419 */
1420 public static double[] normalizeArray(double[] values, double normalizedSum)
1421 throws ArithmeticException, IllegalArgumentException {
1422 if (Double.isInfinite(normalizedSum)) {
1423 throw MathRuntimeException.createIllegalArgumentException(
1424 LocalizedFormats.NORMALIZE_INFINITE);
1425 }
1426 if (Double.isNaN(normalizedSum)) {
1427 throw MathRuntimeException.createIllegalArgumentException(
1428 LocalizedFormats.NORMALIZE_NAN);
1429 }
1430 double sum = 0d;
1431 final int len = values.length;
1432 double[] out = new double[len];
1433 for (int i = 0; i < len; i++) {
1434 if (Double.isInfinite(values[i])) {
1435 throw MathRuntimeException.createArithmeticException(
1436 LocalizedFormats.INFINITE_ARRAY_ELEMENT, values[i], i);
1437 }
1438 if (!Double.isNaN(values[i])) {
1439 sum += values[i];
1440 }
1441 }
1442 if (sum == 0) {
1443 throw MathRuntimeException.createArithmeticException(LocalizedFormats.ARRAY_SUMS_TO_ZERO);
1444 }
1445 for (int i = 0; i < len; i++) {
1446 if (Double.isNaN(values[i])) {
1447 out[i] = Double.NaN;
1448 } else {
1449 out[i] = values[i] * normalizedSum / sum;
1450 }
1451 }
1452 return out;
1453 }
1454
1455 /**
1456 * Round the given value to the specified number of decimal places. The
1457 * value is rounded using the {@link BigDecimal#ROUND_HALF_UP} method.
1458 *
1459 * @param x the value to round.
1460 * @param scale the number of digits to the right of the decimal point.
1461 * @return the rounded value.
1462 * @since 1.1
1463 */
1464 public static double round(double x, int scale) {
1465 return round(x, scale, BigDecimal.ROUND_HALF_UP);
1466 }
1467
1468 /**
1469 * Round the given value to the specified number of decimal places. The
1470 * value is rounded using the given method which is any method defined in
1471 * {@link BigDecimal}.
1472 *
1473 * @param x the value to round.
1474 * @param scale the number of digits to the right of the decimal point.
1475 * @param roundingMethod the rounding method as defined in
1476 * {@link BigDecimal}.
1477 * @return the rounded value.
1478 * @since 1.1
1479 */
1480 public static double round(double x, int scale, int roundingMethod) {
1481 try {
1482 return (new BigDecimal
1483 (Double.toString(x))
1484 .setScale(scale, roundingMethod))
1485 .doubleValue();
1486 } catch (NumberFormatException ex) {
1487 if (Double.isInfinite(x)) {
1488 return x;
1489 } else {
1490 return Double.NaN;
1491 }
1492 }
1493 }
1494
1495 /**
1496 * Round the given value to the specified number of decimal places. The
1497 * value is rounding using the {@link BigDecimal#ROUND_HALF_UP} method.
1498 *
1499 * @param x the value to round.
1500 * @param scale the number of digits to the right of the decimal point.
1501 * @return the rounded value.
1502 * @since 1.1
1503 */
1504 public static float round(float x, int scale) {
1505 return round(x, scale, BigDecimal.ROUND_HALF_UP);
1506 }
1507
1508 /**
1509 * Round the given value to the specified number of decimal places. The
1510 * value is rounded using the given method which is any method defined in
1511 * {@link BigDecimal}.
1512 *
1513 * @param x the value to round.
1514 * @param scale the number of digits to the right of the decimal point.
1515 * @param roundingMethod the rounding method as defined in
1516 * {@link BigDecimal}.
1517 * @return the rounded value.
1518 * @since 1.1
1519 */
1520 public static float round(float x, int scale, int roundingMethod) {
1521 float sign = indicator(x);
1522 float factor = (float)FastMath.pow(10.0f, scale) * sign;
1523 return (float)roundUnscaled(x * factor, sign, roundingMethod) / factor;
1524 }
1525
1526 /**
1527 * Round the given non-negative, value to the "nearest" integer. Nearest is
1528 * determined by the rounding method specified. Rounding methods are defined
1529 * in {@link BigDecimal}.
1530 *
1531 * @param unscaled the value to round.
1532 * @param sign the sign of the original, scaled value.
1533 * @param roundingMethod the rounding method as defined in
1534 * {@link BigDecimal}.
1535 * @return the rounded value.
1536 * @since 1.1
1537 */
1538 private static double roundUnscaled(double unscaled, double sign,
1539 int roundingMethod) {
1540 switch (roundingMethod) {
1541 case BigDecimal.ROUND_CEILING :
1542 if (sign == -1) {
1543 unscaled = FastMath.floor(nextAfter(unscaled, Double.NEGATIVE_INFINITY));
1544 } else {
1545 unscaled = FastMath.ceil(nextAfter(unscaled, Double.POSITIVE_INFINITY));
1546 }
1547 break;
1548 case BigDecimal.ROUND_DOWN :
1549 unscaled = FastMath.floor(nextAfter(unscaled, Double.NEGATIVE_INFINITY));
1550 break;
1551 case BigDecimal.ROUND_FLOOR :
1552 if (sign == -1) {
1553 unscaled = FastMath.ceil(nextAfter(unscaled, Double.POSITIVE_INFINITY));
1554 } else {
1555 unscaled = FastMath.floor(nextAfter(unscaled, Double.NEGATIVE_INFINITY));
1556 }
1557 break;
1558 case BigDecimal.ROUND_HALF_DOWN : {
1559 unscaled = nextAfter(unscaled, Double.NEGATIVE_INFINITY);
1560 double fraction = unscaled - FastMath.floor(unscaled);
1561 if (fraction > 0.5) {
1562 unscaled = FastMath.ceil(unscaled);
1563 } else {
1564 unscaled = FastMath.floor(unscaled);
1565 }
1566 break;
1567 }
1568 case BigDecimal.ROUND_HALF_EVEN : {
1569 double fraction = unscaled - FastMath.floor(unscaled);
1570 if (fraction > 0.5) {
1571 unscaled = FastMath.ceil(unscaled);
1572 } else if (fraction < 0.5) {
1573 unscaled = FastMath.floor(unscaled);
1574 } else {
1575 // The following equality test is intentional and needed for rounding purposes
1576 if (FastMath.floor(unscaled) / 2.0 == FastMath.floor(Math
1577 .floor(unscaled) / 2.0)) { // even
1578 unscaled = FastMath.floor(unscaled);
1579 } else { // odd
1580 unscaled = FastMath.ceil(unscaled);
1581 }
1582 }
1583 break;
1584 }
1585 case BigDecimal.ROUND_HALF_UP : {
1586 unscaled = nextAfter(unscaled, Double.POSITIVE_INFINITY);
1587 double fraction = unscaled - FastMath.floor(unscaled);
1588 if (fraction >= 0.5) {
1589 unscaled = FastMath.ceil(unscaled);
1590 } else {
1591 unscaled = FastMath.floor(unscaled);
1592 }
1593 break;
1594 }
1595 case BigDecimal.ROUND_UNNECESSARY :
1596 if (unscaled != FastMath.floor(unscaled)) {
1597 throw new ArithmeticException("Inexact result from rounding");
1598 }
1599 break;
1600 case BigDecimal.ROUND_UP :
1601 unscaled = FastMath.ceil(nextAfter(unscaled, Double.POSITIVE_INFINITY));
1602 break;
1603 default :
1604 throw MathRuntimeException.createIllegalArgumentException(
1605 LocalizedFormats.INVALID_ROUNDING_METHOD,
1606 roundingMethod,
1607 "ROUND_CEILING", BigDecimal.ROUND_CEILING,
1608 "ROUND_DOWN", BigDecimal.ROUND_DOWN,
1609 "ROUND_FLOOR", BigDecimal.ROUND_FLOOR,
1610 "ROUND_HALF_DOWN", BigDecimal.ROUND_HALF_DOWN,
1611 "ROUND_HALF_EVEN", BigDecimal.ROUND_HALF_EVEN,
1612 "ROUND_HALF_UP", BigDecimal.ROUND_HALF_UP,
1613 "ROUND_UNNECESSARY", BigDecimal.ROUND_UNNECESSARY,
1614 "ROUND_UP", BigDecimal.ROUND_UP);
1615 }
1616 return unscaled;
1617 }
1618
1619 /**
1620 * Returns the <a href="http://mathworld.wolfram.com/Sign.html"> sign</a>
1621 * for byte value <code>x</code>.
1622 * <p>
1623 * For a byte value x, this method returns (byte)(+1) if x > 0, (byte)(0) if
1624 * x = 0, and (byte)(-1) if x < 0.</p>
1625 *
1626 * @param x the value, a byte
1627 * @return (byte)(+1), (byte)(0), or (byte)(-1), depending on the sign of x
1628 */
1629 public static byte sign(final byte x) {
1630 return (x == ZB) ? ZB : (x > ZB) ? PB : NB;
1631 }
1632
1633 /**
1634 * Returns the <a href="http://mathworld.wolfram.com/Sign.html"> sign</a>
1635 * for double precision <code>x</code>.
1636 * <p>
1637 * For a double value <code>x</code>, this method returns
1638 * <code>+1.0</code> if <code>x > 0</code>, <code>0.0</code> if
1639 * <code>x = 0.0</code>, and <code>-1.0</code> if <code>x < 0</code>.
1640 * Returns <code>NaN</code> if <code>x</code> is <code>NaN</code>.</p>
1641 *
1642 * @param x the value, a double
1643 * @return +1.0, 0.0, or -1.0, depending on the sign of x
1644 */
1645 public static double sign(final double x) {
1646 if (Double.isNaN(x)) {
1647 return Double.NaN;
1648 }
1649 return (x == 0.0) ? 0.0 : (x > 0.0) ? 1.0 : -1.0;
1650 }
1651
1652 /**
1653 * Returns the <a href="http://mathworld.wolfram.com/Sign.html"> sign</a>
1654 * for float value <code>x</code>.
1655 * <p>
1656 * For a float value x, this method returns +1.0F if x > 0, 0.0F if x =
1657 * 0.0F, and -1.0F if x < 0. Returns <code>NaN</code> if <code>x</code>
1658 * is <code>NaN</code>.</p>
1659 *
1660 * @param x the value, a float
1661 * @return +1.0F, 0.0F, or -1.0F, depending on the sign of x
1662 */
1663 public static float sign(final float x) {
1664 if (Float.isNaN(x)) {
1665 return Float.NaN;
1666 }
1667 return (x == 0.0F) ? 0.0F : (x > 0.0F) ? 1.0F : -1.0F;
1668 }
1669
1670 /**
1671 * Returns the <a href="http://mathworld.wolfram.com/Sign.html"> sign</a>
1672 * for int value <code>x</code>.
1673 * <p>
1674 * For an int value x, this method returns +1 if x > 0, 0 if x = 0, and -1
1675 * if x < 0.</p>
1676 *
1677 * @param x the value, an int
1678 * @return +1, 0, or -1, depending on the sign of x
1679 */
1680 public static int sign(final int x) {
1681 return (x == 0) ? 0 : (x > 0) ? 1 : -1;
1682 }
1683
1684 /**
1685 * Returns the <a href="http://mathworld.wolfram.com/Sign.html"> sign</a>
1686 * for long value <code>x</code>.
1687 * <p>
1688 * For a long value x, this method returns +1L if x > 0, 0L if x = 0, and
1689 * -1L if x < 0.</p>
1690 *
1691 * @param x the value, a long
1692 * @return +1L, 0L, or -1L, depending on the sign of x
1693 */
1694 public static long sign(final long x) {
1695 return (x == 0L) ? 0L : (x > 0L) ? 1L : -1L;
1696 }
1697
1698 /**
1699 * Returns the <a href="http://mathworld.wolfram.com/Sign.html"> sign</a>
1700 * for short value <code>x</code>.
1701 * <p>
1702 * For a short value x, this method returns (short)(+1) if x > 0, (short)(0)
1703 * if x = 0, and (short)(-1) if x < 0.</p>
1704 *
1705 * @param x the value, a short
1706 * @return (short)(+1), (short)(0), or (short)(-1), depending on the sign of
1707 * x
1708 */
1709 public static short sign(final short x) {
1710 return (x == ZS) ? ZS : (x > ZS) ? PS : NS;
1711 }
1712
1713 /**
1714 * Returns the <a href="http://mathworld.wolfram.com/HyperbolicSine.html">
1715 * hyperbolic sine</a> of x.
1716 *
1717 * @param x double value for which to find the hyperbolic sine
1718 * @return hyperbolic sine of x
1719 */
1720 public static double sinh(double x) {
1721 return (FastMath.exp(x) - FastMath.exp(-x)) / 2.0;
1722 }
1723
1724 /**
1725 * Subtract two integers, checking for overflow.
1726 *
1727 * @param x the minuend
1728 * @param y the subtrahend
1729 * @return the difference <code>x-y</code>
1730 * @throws ArithmeticException if the result can not be represented as an
1731 * int
1732 * @since 1.1
1733 */
1734 public static int subAndCheck(int x, int y) {
1735 long s = (long)x - (long)y;
1736 if (s < Integer.MIN_VALUE || s > Integer.MAX_VALUE) {
1737 throw MathRuntimeException.createArithmeticException(LocalizedFormats.OVERFLOW_IN_SUBTRACTION, x, y);
1738 }
1739 return (int)s;
1740 }
1741
1742 /**
1743 * Subtract two long integers, checking for overflow.
1744 *
1745 * @param a first value
1746 * @param b second value
1747 * @return the difference <code>a-b</code>
1748 * @throws ArithmeticException if the result can not be represented as an
1749 * long
1750 * @since 1.2
1751 */
1752 public static long subAndCheck(long a, long b) {
1753 long ret;
1754 String msg = "overflow: subtract";
1755 if (b == Long.MIN_VALUE) {
1756 if (a < 0) {
1757 ret = a - b;
1758 } else {
1759 throw new ArithmeticException(msg);
1760 }
1761 } else {
1762 // use additive inverse
1763 ret = addAndCheck(a, -b, LocalizedFormats.OVERFLOW_IN_ADDITION);
1764 }
1765 return ret;
1766 }
1767
1768 /**
1769 * Raise an int to an int power.
1770 * @param k number to raise
1771 * @param e exponent (must be positive or null)
1772 * @return k<sup>e</sup>
1773 * @exception IllegalArgumentException if e is negative
1774 */
1775 public static int pow(final int k, int e)
1776 throws IllegalArgumentException {
1777
1778 if (e < 0) {
1779 throw MathRuntimeException.createIllegalArgumentException(
1780 LocalizedFormats.POWER_NEGATIVE_PARAMETERS,
1781 k, e);
1782 }
1783
1784 int result = 1;
1785 int k2p = k;
1786 while (e != 0) {
1787 if ((e & 0x1) != 0) {
1788 result *= k2p;
1789 }
1790 k2p *= k2p;
1791 e = e >> 1;
1792 }
1793
1794 return result;
1795
1796 }
1797
1798 /**
1799 * Raise an int to a long power.
1800 * @param k number to raise
1801 * @param e exponent (must be positive or null)
1802 * @return k<sup>e</sup>
1803 * @exception IllegalArgumentException if e is negative
1804 */
1805 public static int pow(final int k, long e)
1806 throws IllegalArgumentException {
1807
1808 if (e < 0) {
1809 throw MathRuntimeException.createIllegalArgumentException(
1810 LocalizedFormats.POWER_NEGATIVE_PARAMETERS,
1811 k, e);
1812 }
1813
1814 int result = 1;
1815 int k2p = k;
1816 while (e != 0) {
1817 if ((e & 0x1) != 0) {
1818 result *= k2p;
1819 }
1820 k2p *= k2p;
1821 e = e >> 1;
1822 }
1823
1824 return result;
1825
1826 }
1827
1828 /**
1829 * Raise a long to an int power.
1830 * @param k number to raise
1831 * @param e exponent (must be positive or null)
1832 * @return k<sup>e</sup>
1833 * @exception IllegalArgumentException if e is negative
1834 */
1835 public static long pow(final long k, int e)
1836 throws IllegalArgumentException {
1837
1838 if (e < 0) {
1839 throw MathRuntimeException.createIllegalArgumentException(
1840 LocalizedFormats.POWER_NEGATIVE_PARAMETERS,
1841 k, e);
1842 }
1843
1844 long result = 1l;
1845 long k2p = k;
1846 while (e != 0) {
1847 if ((e & 0x1) != 0) {
1848 result *= k2p;
1849 }
1850 k2p *= k2p;
1851 e = e >> 1;
1852 }
1853
1854 return result;
1855
1856 }
1857
1858 /**
1859 * Raise a long to a long power.
1860 * @param k number to raise
1861 * @param e exponent (must be positive or null)
1862 * @return k<sup>e</sup>
1863 * @exception IllegalArgumentException if e is negative
1864 */
1865 public static long pow(final long k, long e)
1866 throws IllegalArgumentException {
1867
1868 if (e < 0) {
1869 throw MathRuntimeException.createIllegalArgumentException(
1870 LocalizedFormats.POWER_NEGATIVE_PARAMETERS,
1871 k, e);
1872 }
1873
1874 long result = 1l;
1875 long k2p = k;
1876 while (e != 0) {
1877 if ((e & 0x1) != 0) {
1878 result *= k2p;
1879 }
1880 k2p *= k2p;
1881 e = e >> 1;
1882 }
1883
1884 return result;
1885
1886 }
1887
1888 /**
1889 * Raise a BigInteger to an int power.
1890 * @param k number to raise
1891 * @param e exponent (must be positive or null)
1892 * @return k<sup>e</sup>
1893 * @exception IllegalArgumentException if e is negative
1894 */
1895 public static BigInteger pow(final BigInteger k, int e)
1896 throws IllegalArgumentException {
1897
1898 if (e < 0) {
1899 throw MathRuntimeException.createIllegalArgumentException(
1900 LocalizedFormats.POWER_NEGATIVE_PARAMETERS,
1901 k, e);
1902 }
1903
1904 return k.pow(e);
1905
1906 }
1907
1908 /**
1909 * Raise a BigInteger to a long power.
1910 * @param k number to raise
1911 * @param e exponent (must be positive or null)
1912 * @return k<sup>e</sup>
1913 * @exception IllegalArgumentException if e is negative
1914 */
1915 public static BigInteger pow(final BigInteger k, long e)
1916 throws IllegalArgumentException {
1917
1918 if (e < 0) {
1919 throw MathRuntimeException.createIllegalArgumentException(
1920 LocalizedFormats.POWER_NEGATIVE_PARAMETERS,
1921 k, e);
1922 }
1923
1924 BigInteger result = BigInteger.ONE;
1925 BigInteger k2p = k;
1926 while (e != 0) {
1927 if ((e & 0x1) != 0) {
1928 result = result.multiply(k2p);
1929 }
1930 k2p = k2p.multiply(k2p);
1931 e = e >> 1;
1932 }
1933
1934 return result;
1935
1936 }
1937
1938 /**
1939 * Raise a BigInteger to a BigInteger power.
1940 * @param k number to raise
1941 * @param e exponent (must be positive or null)
1942 * @return k<sup>e</sup>
1943 * @exception IllegalArgumentException if e is negative
1944 */
1945 public static BigInteger pow(final BigInteger k, BigInteger e)
1946 throws IllegalArgumentException {
1947
1948 if (e.compareTo(BigInteger.ZERO) < 0) {
1949 throw MathRuntimeException.createIllegalArgumentException(
1950 LocalizedFormats.POWER_NEGATIVE_PARAMETERS,
1951 k, e);
1952 }
1953
1954 BigInteger result = BigInteger.ONE;
1955 BigInteger k2p = k;
1956 while (!BigInteger.ZERO.equals(e)) {
1957 if (e.testBit(0)) {
1958 result = result.multiply(k2p);
1959 }
1960 k2p = k2p.multiply(k2p);
1961 e = e.shiftRight(1);
1962 }
1963
1964 return result;
1965
1966 }
1967
1968 /**
1969 * Calculates the L<sub>1</sub> (sum of abs) distance between two points.
1970 *
1971 * @param p1 the first point
1972 * @param p2 the second point
1973 * @return the L<sub>1</sub> distance between the two points
1974 */
1975 public static double distance1(double[] p1, double[] p2) {
1976 double sum = 0;
1977 for (int i = 0; i < p1.length; i++) {
1978 sum += FastMath.abs(p1[i] - p2[i]);
1979 }
1980 return sum;
1981 }
1982
1983 /**
1984 * Calculates the L<sub>1</sub> (sum of abs) distance between two points.
1985 *
1986 * @param p1 the first point
1987 * @param p2 the second point
1988 * @return the L<sub>1</sub> distance between the two points
1989 */
1990 public static int distance1(int[] p1, int[] p2) {
1991 int sum = 0;
1992 for (int i = 0; i < p1.length; i++) {
1993 sum += FastMath.abs(p1[i] - p2[i]);
1994 }
1995 return sum;
1996 }
1997
1998 /**
1999 * Calculates the L<sub>2</sub> (Euclidean) distance between two points.
2000 *
2001 * @param p1 the first point
2002 * @param p2 the second point
2003 * @return the L<sub>2</sub> distance between the two points
2004 */
2005 public static double distance(double[] p1, double[] p2) {
2006 double sum = 0;
2007 for (int i = 0; i < p1.length; i++) {
2008 final double dp = p1[i] - p2[i];
2009 sum += dp * dp;
2010 }
2011 return FastMath.sqrt(sum);
2012 }
2013
2014 /**
2015 * Calculates the L<sub>2</sub> (Euclidean) distance between two points.
2016 *
2017 * @param p1 the first point
2018 * @param p2 the second point
2019 * @return the L<sub>2</sub> distance between the two points
2020 */
2021 public static double distance(int[] p1, int[] p2) {
2022 double sum = 0;
2023 for (int i = 0; i < p1.length; i++) {
2024 final double dp = p1[i] - p2[i];
2025 sum += dp * dp;
2026 }
2027 return FastMath.sqrt(sum);
2028 }
2029
2030 /**
2031 * Calculates the L<sub>&infin;</sub> (max of abs) distance between two points.
2032 *
2033 * @param p1 the first point
2034 * @param p2 the second point
2035 * @return the L<sub>&infin;</sub> distance between the two points
2036 */
2037 public static double distanceInf(double[] p1, double[] p2) {
2038 double max = 0;
2039 for (int i = 0; i < p1.length; i++) {
2040 max = FastMath.max(max, FastMath.abs(p1[i] - p2[i]));
2041 }
2042 return max;
2043 }
2044
2045 /**
2046 * Calculates the L<sub>&infin;</sub> (max of abs) distance between two points.
2047 *
2048 * @param p1 the first point
2049 * @param p2 the second point
2050 * @return the L<sub>&infin;</sub> distance between the two points
2051 */
2052 public static int distanceInf(int[] p1, int[] p2) {
2053 int max = 0;
2054 for (int i = 0; i < p1.length; i++) {
2055 max = FastMath.max(max, FastMath.abs(p1[i] - p2[i]));
2056 }
2057 return max;
2058 }
2059
2060 /**
2061 * Specification of ordering direction.
2062 */
2063 public static enum OrderDirection {
2064 /** Constant for increasing direction. */
2065 INCREASING,
2066 /** Constant for decreasing direction. */
2067 DECREASING
2068 }
2069
2070 /**
2071 * Checks that the given array is sorted.
2072 *
2073 * @param val Values.
2074 * @param dir Ordering direction.
2075 * @param strict Whether the order should be strict.
2076 * @throws NonMonotonousSequenceException if the array is not sorted.
2077 * @since 2.2
2078 */
2079 public static void checkOrder(double[] val, OrderDirection dir, boolean strict) {
2080 double previous = val[0];
2081 boolean ok = true;
2082
2083 int max = val.length;
2084 for (int i = 1; i < max; i++) {
2085 switch (dir) {
2086 case INCREASING:
2087 if (strict) {
2088 if (val[i] <= previous) {
2089 ok = false;
2090 }
2091 } else {
2092 if (val[i] < previous) {
2093 ok = false;
2094 }
2095 }
2096 break;
2097 case DECREASING:
2098 if (strict) {
2099 if (val[i] >= previous) {
2100 ok = false;
2101 }
2102 } else {
2103 if (val[i] > previous) {
2104 ok = false;
2105 }
2106 }
2107 break;
2108 default:
2109 // Should never happen.
2110 throw new IllegalArgumentException();
2111 }
2112
2113 if (!ok) {
2114 throw new NonMonotonousSequenceException(val[i], previous, i, dir, strict);
2115 }
2116 previous = val[i];
2117 }
2118 }
2119
2120 /**
2121 * Checks that the given array is sorted in strictly increasing order.
2122 *
2123 * @param val Values.
2124 * @throws NonMonotonousSequenceException if the array is not sorted.
2125 * @since 2.2
2126 */
2127 public static void checkOrder(double[] val) {
2128 checkOrder(val, OrderDirection.INCREASING, true);
2129 }
2130
2131 /**
2132 * Checks that the given array is sorted.
2133 *
2134 * @param val Values
2135 * @param dir Order direction (-1 for decreasing, 1 for increasing)
2136 * @param strict Whether the order should be strict
2137 * @throws NonMonotonousSequenceException if the array is not sorted.
2138 * @deprecated as of 2.2 (please use the new {@link #checkOrder(double[],OrderDirection,boolean)
2139 * checkOrder} method). To be removed in 3.0.
2140 */
2141 @Deprecated
2142 public static void checkOrder(double[] val, int dir, boolean strict) {
2143 if (dir > 0) {
2144 checkOrder(val, OrderDirection.INCREASING, strict);
2145 } else {
2146 checkOrder(val, OrderDirection.DECREASING, strict);
2147 }
2148 }
2149
2150 /**
2151 * Returns the Cartesian norm (2-norm), handling both overflow and underflow.
2152 * Translation of the minpack enorm subroutine.
2153 *
2154 * The redistribution policy for MINPACK is available <a
2155 * href="http://www.netlib.org/minpack/disclaimer">here</a>, for convenience, it
2156 * is reproduced below.</p>
2157 *
2158 * <table border="0" width="80%" cellpadding="10" align="center" bgcolor="#E0E0E0">
2159 * <tr><td>
2160 * Minpack Copyright Notice (1999) University of Chicago.
2161 * All rights reserved
2162 * </td></tr>
2163 * <tr><td>
2164 * Redistribution and use in source and binary forms, with or without
2165 * modification, are permitted provided that the following conditions
2166 * are met:
2167 * <ol>
2168 * <li>Redistributions of source code must retain the above copyright
2169 * notice, this list of conditions and the following disclaimer.</li>
2170 * <li>Redistributions in binary form must reproduce the above
2171 * copyright notice, this list of conditions and the following
2172 * disclaimer in the documentation and/or other materials provided
2173 * with the distribution.</li>
2174 * <li>The end-user documentation included with the redistribution, if any,
2175 * must include the following acknowledgment:
2176 * <code>This product includes software developed by the University of
2177 * Chicago, as Operator of Argonne National Laboratory.</code>
2178 * Alternately, this acknowledgment may appear in the software itself,
2179 * if and wherever such third-party acknowledgments normally appear.</li>
2180 * <li><strong>WARRANTY DISCLAIMER. THE SOFTWARE IS SUPPLIED "AS IS"
2181 * WITHOUT WARRANTY OF ANY KIND. THE COPYRIGHT HOLDER, THE
2182 * UNITED STATES, THE UNITED STATES DEPARTMENT OF ENERGY, AND
2183 * THEIR EMPLOYEES: (1) DISCLAIM ANY WARRANTIES, EXPRESS OR
2184 * IMPLIED, INCLUDING BUT NOT LIMITED TO ANY IMPLIED WARRANTIES
2185 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE
2186 * OR NON-INFRINGEMENT, (2) DO NOT ASSUME ANY LEGAL LIABILITY
2187 * OR RESPONSIBILITY FOR THE ACCURACY, COMPLETENESS, OR
2188 * USEFULNESS OF THE SOFTWARE, (3) DO NOT REPRESENT THAT USE OF
2189 * THE SOFTWARE WOULD NOT INFRINGE PRIVATELY OWNED RIGHTS, (4)
2190 * DO NOT WARRANT THAT THE SOFTWARE WILL FUNCTION
2191 * UNINTERRUPTED, THAT IT IS ERROR-FREE OR THAT ANY ERRORS WILL
2192 * BE CORRECTED.</strong></li>
2193 * <li><strong>LIMITATION OF LIABILITY. IN NO EVENT WILL THE COPYRIGHT
2194 * HOLDER, THE UNITED STATES, THE UNITED STATES DEPARTMENT OF
2195 * ENERGY, OR THEIR EMPLOYEES: BE LIABLE FOR ANY INDIRECT,
2196 * INCIDENTAL, CONSEQUENTIAL, SPECIAL OR PUNITIVE DAMAGES OF
2197 * ANY KIND OR NATURE, INCLUDING BUT NOT LIMITED TO LOSS OF
2198 * PROFITS OR LOSS OF DATA, FOR ANY REASON WHATSOEVER, WHETHER
2199 * SUCH LIABILITY IS ASSERTED ON THE BASIS OF CONTRACT, TORT
2200 * (INCLUDING NEGLIGENCE OR STRICT LIABILITY), OR OTHERWISE,
2201 * EVEN IF ANY OF SAID PARTIES HAS BEEN WARNED OF THE
2202 * POSSIBILITY OF SUCH LOSS OR DAMAGES.</strong></li>
2203 * <ol></td></tr>
2204 * </table>
2205 *
2206 * @param v vector of doubles
2207 * @return the 2-norm of the vector
2208 * @since 2.2
2209 */
2210 public static double safeNorm(double[] v) {
2211 double rdwarf = 3.834e-20;
2212 double rgiant = 1.304e+19;
2213 double s1=0.0;
2214 double s2=0.0;
2215 double s3=0.0;
2216 double x1max = 0.0;
2217 double x3max = 0.0;
2218 double floatn = (double)v.length;
2219 double agiant = rgiant/floatn;
2220 for (int i=0;i<v.length;i++) {
2221 double xabs = Math.abs(v[i]);
2222 if (xabs<rdwarf || xabs>agiant) {
2223 if (xabs>rdwarf) {
2224 if (xabs>x1max) {
2225 double r=x1max/xabs;
2226 s1=1.0+s1*r*r;
2227 x1max=xabs;
2228 } else {
2229 double r=xabs/x1max;
2230 s1+=r*r;
2231 }
2232 } else {
2233 if (xabs>x3max) {
2234 double r=x3max/xabs;
2235 s3=1.0+s3*r*r;
2236 x3max=xabs;
2237 } else {
2238 if (xabs!=0.0) {
2239 double r=xabs/x3max;
2240 s3+=r*r;
2241 }
2242 }
2243 }
2244 } else {
2245 s2+=xabs*xabs;
2246 }
2247 }
2248 double norm;
2249 if (s1!=0.0) {
2250 norm = x1max*Math.sqrt(s1+(s2/x1max)/x1max);
2251 } else {
2252 if (s2==0.0) {
2253 norm = x3max*Math.sqrt(s3);
2254 } else {
2255 if (s2>=x3max) {
2256 norm = Math.sqrt(s2*(1.0+(x3max/s2)*(x3max*s3)));
2257 } else {
2258 norm = Math.sqrt(x3max*((s2/x3max)+(x3max*s3)));
2259 }
2260 }
2261 }
2262 return norm;
2263}
2264
2265}