예제 #1
0
 /**
  * Returns the angle theta such that <code>(x == cos(theta)) && (y == sin(theta))</code>.
  *
  * @param y the y value.
  * @param x the x value.
  * @return the angle theta in radians.
  */
 public static double atan2(double y, double x) {
   final double epsilon = 1E-128;
   if (MathLib.abs(x) > epsilon) {
     double temp = MathLib.atan(MathLib.abs(y) / MathLib.abs(x));
     if (x < 0.0) temp = PI - temp;
     if (y < 0.0) temp = TWO_PI - temp;
     return temp;
   } else if (y > epsilon) return HALF_PI;
   else if (y < -epsilon) return 3 * HALF_PI;
   else return 0.0;
 }
예제 #2
0
 /**
  * Returns a pseudo random <code>int</code> value in the range <code>[min, max]</code> (fast and
  * thread-safe without synchronization).
  *
  * @param min the minimum value inclusive.
  * @param max the maximum value exclusive.
  * @return a pseudo random number in the range <code>[min, max]</code>.
  */
 public static int random(int min, int max) {
   int next = RANDOM.nextInt();
   if ((next >= min) && (next <= max)) return next;
   next += Integer.MIN_VALUE;
   if ((next >= min) && (next <= max)) return next;
   // We should not have interval overflow as the interval has to be less
   // or equal to Integer.MAX_VALUE (otherwise we would have exited before).
   final int interval = 1 + max - min; // Positive.
   if (interval <= 0) throw new Error("Interval [" + min + ".." + max + "] error"); // In case.
   return MathLib.abs(next % interval) + min;
 }
예제 #3
0
 /**
  * Returns a pseudo random <code>long</code> value in the range <code>[min, max]</code> (fast and
  * thread-safe without synchronization).
  *
  * @param min the minimum value inclusive.
  * @param max the maximum value inclusive.
  * @return a pseudo random number in the range <code>[min, max]</code>.
  */
 public static long random(long min, long max) {
   long next = RANDOM.nextLong();
   if ((next >= min) && (next <= max)) return next;
   next += Long.MIN_VALUE;
   if ((next >= min) && (next <= max)) return next;
   // We should not have interval overflow as the interval has to be less
   // or equal to Long.MAX_VALUE (otherwise we would have exited before).
   final long interval = 1L + max - min; // Positive.
   if (interval <= 0) throw new Error("Interval error"); // Sanity check.
   return MathLib.abs(next % interval) + min;
 }
예제 #4
0
  static double _atan(double x) {
    double w, s1, s2, z;
    int ix, hx, id;
    long xBits = Double.doubleToLongBits(x);
    int __HIx = (int) (xBits >> 32);
    int __LOx = (int) xBits;

    hx = __HIx;
    ix = hx & 0x7fffffff;
    if (ix >= 0x44100000) { // if |x| >= 2^66
      if (ix > 0x7ff00000 || (ix == 0x7ff00000 && (__LOx != 0))) return x + x; // NaN
      if (hx > 0) return atanhi[3] + atanlo[3];
      else return -atanhi[3] - atanlo[3];
    }
    if (ix < 0x3fdc0000) { // |x| < 0.4375
      if (ix < 0x3e200000) // |x| < 2^-29
      if (huge + x > one) return x;
      id = -1;
    } else {
      x = MathLib.abs(x);
      if (ix < 0x3ff30000) // |x| < 1.1875
      if (ix < 0x3fe60000) { // 7/16 <=|x|<11/16
          id = 0;
          x = (2.0 * x - one) / (2.0 + x);
        } else { // 11/16<=|x|< 19/16
          id = 1;
          x = (x - one) / (x + one);
        }
      else if (ix < 0x40038000) { // |x| < 2.4375
        id = 2;
        x = (x - 1.5) / (one + 1.5 * x);
      } else { // 2.4375 <= |x| < 2^66
        id = 3;
        x = -1.0 / x;
      }
    }
    // end of argument reduction
    z = x * x;
    w = z * z;
    // break sum from i=0 to 10 aT[i]z**(i+1) into odd and even poly
    s1 = z * (aT[0] + w * (aT[2] + w * (aT[4] + w * (aT[6] + w * (aT[8] + w * aT[10])))));
    s2 = w * (aT[1] + w * (aT[3] + w * (aT[5] + w * (aT[7] + w * aT[9]))));
    if (id < 0) return x - x * (s1 + s2);
    else {
      z = atanhi[id] - ((x * (s1 + s2) - atanlo[id]) - x);
      return (hx < 0) ? -z : z;
    }
  }
예제 #5
0
 /**
  * Returns the remainder of the division of the specified two arguments.
  *
  * @param x the dividend.
  * @param y the divisor.
  * @return <code>x - round(x / y) * y</code>
  */
 public static double rem(double x, double y) {
   double tmp = x / y;
   if (MathLib.abs(tmp) <= Long.MAX_VALUE) return x - MathLib.round(tmp) * y;
   else return NaN;
 }