// Copyright (c) Corporation for National Research Initiatives
package org.python.modules;
import org.python.core.*;
import java.lang.Math;
public class math implements ClassDictInit {
public static PyFloat pi = new PyFloat(Math.PI);
public static PyFloat e = new PyFloat(Math.E);
public static void classDictInit(PyObject dict) {
}
private static double check(double v) {
if (Double.isNaN(v))
throw Py.ValueError("math domain error");
if (Double.isInfinite(v))
throw Py.OverflowError("math range error");
return v;
}
public static double acos(double v) {
return check(Math.acos(v));
}
public static double asin(double v) {
return check(Math.asin(v));
}
public static double atan(double v) {
return check(Math.atan(v));
}
public static double atan2(double v, double w) {
return check(Math.atan2(v, w));
}
public static double ceil(double v) {
return check(Math.ceil(v));
}
public static double cos(double v) {
return check(Math.cos(v));
}
public static double exp(double v) {
return check(Math.exp(v));
}
public static double floor(PyObject v) {
return floor(v.__float__().getValue());
}
public static double floor(double v) {
return check(Math.floor(v));
}
public static double log(PyObject v) {
if (v instanceof PyLong) {
int e[] = new int[1];
double x = ((PyLong) v).scaledDoubleValue(e);
if (x <= 0.0)
throw Py.ValueError("math domain error");
return log(x) + (e[0] * 8.0) * log(2.0);
}
return log(v.__float__().getValue());
}
private static double log(double v) {
return check(Math.log(v));
}
public static double pow(double v, double w) {
return check(Math.pow(v, w));
}
public static double sin(PyObject v) {
return sin(v.__float__().getValue());
}
public static double sin(double v) {
return check(Math.sin(v));
}
public static double sqrt(PyObject v) {
return sqrt(v.__float__().getValue());
}
public static double sqrt(double v) {
return check(Math.sqrt(v));
}
public static double tan(double v) {
return check(Math.tan(v));
}
public static double log10(PyObject v) {
if (v instanceof PyLong) {
int e[] = new int[1];
double x = ((PyLong) v).scaledDoubleValue(e);
if (x <= 0.0)
throw Py.ValueError("math domain error");
return log10(x) + (e[0] * 8.0) * log10(2.0);
}
return log10(v.__float__().getValue());
}
private static double log10(double v) {
return check(ExtraMath.log10(v));
}
public static double sinh(double v) {
return check(0.5 * (Math.exp(v) - Math.exp(-v)));
}
public static double cosh(double v) {
return check(0.5 * (Math.exp(v) + Math.exp(-v)));
}
public static double tanh(double v) {
return check(sinh(v) / cosh(v));
}
public static double fabs(double v) {
return Math.abs(v);
}
public static double fmod(double v, double w) {
return v % w;
}
public static PyTuple modf(double v) {
double w = v % 1.0;
v -= w;
return new PyTuple(new PyObject[] { new PyFloat(w), new PyFloat(v) });
}
public static PyTuple frexp(double v) {
int i = 0;
if (v != 0.0) {
int sign = 1;
if (v < 0) {
sign = -1;
v = -v;
}
// slow...
while (v < 0.5) {
v = v * 2.0;
i = i - 1;
}
while (v >= 1.0) {
v = v * 0.5;
i = i + 1;
}
v = v * sign;
}
return new PyTuple(new PyObject[] { new PyFloat(v), new PyInteger(i) });
}
public static double ldexp(double v, int w) {
return check(v * Math.pow(2.0, w));
}
public static double hypot(double v, double w) {
return check(ExtraMath.hypot(v, w));
}
}