org.python.core.ExtraMath Maven / Gradle / Ivy
// Copyright (c) Corporation for National Research Initiatives
package org.python.core;
/**
* A static utility class with two additional math functions.
*/
public class ExtraMath {
public static double LOG10 = Math.log(10.0);
public static double EPSILON = Math.pow(2.0, -52.0);
public static double CLOSE = EPSILON * 2.0;
public static double log10(double v) {
return Math.log(v) / LOG10;
}
public static double hypot(double v, double w) {
v = Math.abs(v);
w = Math.abs(w);
if (v < w) {
double temp = v;
v = w;
w = temp;
}
if (v == 0.0) {
return 0.0;
} else {
double wv = w / v;
return v * Math.sqrt(1.0 + wv * wv);
}
}
/**
* Are v and w "close" to each other? Uses a scaled tolerance.
*/
public static boolean close(double v, double w, double tol) {
if (v == w) {
return true;
}
double scaled = tol * (Math.abs(v) + Math.abs(w)) / 2.0;
return Math.abs(w - v) < scaled;
}
public static boolean close(double v, double w) {
return close(v, w, CLOSE);
}
/**
* Returns floor(v) except when v is very close to the next number, when it
* returns ceil(v);
*/
public static double closeFloor(double v) {
double floor = Math.floor(v);
return close(v, floor + 1.0) ? floor + 1.0 : floor;
}
}