深入學習java源碼之Math.sin()與 Math.sqrt()
native關鍵字
凡是一種語言,都希望是純。比如解決某一個方案都喜歡就單單這個語言來寫即可。Java平臺有個用戶和本地C代碼進行互操作的API,稱為JNI
native關鍵字告訴編譯器(其實是JVM)調用的是該方法在外部定義,這里指的是C。
Modifier and TypeMethod and Descriptionstatic doubleacos(double a) 返回值的反余弦值; 返回的角度在0.0到pi的范圍內。 static intaddExact(int x, int y) 返回其參數的總和,如果結果溢出int,則拋出 int 。 static longaddExact(long x, long y) 返回其參數的總和,如果結果溢出long,則拋出 long 。 static doubleasin(double a) 返回值的正弦值; 返回角度在pi / 2到pi / 2的范圍內。 static doubleatan(double a) 返回值的反正切值; 返回角度在pi / 2到pi / 2的范圍內。 static doubleatan2(double y, double x) 返回從直角坐標(轉換角度 theta x , y )為極坐標 (R,θ-)。 static doublecbrt(double a) 返回 double值的多維數據集根。 static doubleceil(double a) 返回大于或等于參數的最小(最接近負無窮大) double值,等于一個數學整數。 static doublecopySign(double magnitude, double sign) 使用第二個浮點參數的符號返回第一個浮點參數。 static floatcopySign(float magnitude, float sign) 使用第二個浮點參數的符號返回第一個浮點參數。 static doublecos(double a) 返回角度的三角余弦。 static doublecosh(double x) 返回的雙曲余弦 double值。 static doubleexp(double a) 返回歐拉的數字 e提高到一個 double價值。 static doubleexpm1(double x) 返回 e x -1。 static doublehypot(double x, double y) 返回sqrt( x 2 + y 2 ),沒有中間溢出或下溢。 static doublelog(double a) 返回的自然對數(以 e為底) double值。 static doublelog10(double a) 返回一個 double的基數10對數值。 static doublelog1p(double x) 返回參數和1的和的自然對數。 static doublepow(double a, double b) 將第一個參數的值返回到第二個參數的冪。 static doublerandom() 返回值為 double值為正號,大于等于 0.0 ,小于 1.0 。 static doublerint(double a) 返回與參數最接近值的 double值,并且等于數學整數。 static longround(double a) 返回參數中最接近的 long ,其中 long四舍五入為正無窮大。 static intround(float a) 返回參數中最接近的 int ,其中 int四舍五入為正無窮大。 static doublesin(double a) 返回角度的三角正弦。 static doublesinh(double x) 返回的雙曲正弦 double值。 static doublesqrt(double a) 返回的正確舍入正平方根 double值。 static doubletan(double a) 返回角度的三角正切。 static doubletanh(double x) 返回的雙曲正切 double值。 static doubleulp(double d) 返回參數的ulp的大小。 static floatulp(float f) 返回參數的ulp的大小。
java源碼
public final class Math {
private Math() {}
public static final double E = 2.7182818284590452354;
public static final double PI = 3.14159265358979323846;
public static double sin(double a) {
return StrictMath.sin(a); // default impl. delegates to StrictMath
}
public static double cos(double a) {
return StrictMath.cos(a); // default impl. delegates to StrictMath
}
public static double tan(double a) {
return StrictMath.tan(a); // default impl. delegates to StrictMath
}
public static double asin(double a) {
return StrictMath.asin(a); // default impl. delegates to StrictMath
}
public static double acos(double a) {
return StrictMath.acos(a); // default impl. delegates to StrictMath
}
public static double atan(double a) {
return StrictMath.atan(a); // default impl. delegates to StrictMath
}
public static double exp(double a) {
return StrictMath.exp(a); // default impl. delegates to StrictMath
}
public static double log(double a) {
return StrictMath.log(a); // default impl. delegates to StrictMath
}
public static double log10(double a) {
return StrictMath.log10(a); // default impl. delegates to StrictMath
}
public static double sqrt(double a) {
return StrictMath.sqrt(a); // default impl. delegates to StrictMath
// Note that hardware sqrt instructions
// frequently can be directly used by JITs
// and should be much faster than doing
// Math.sqrt in software.
}
public static double cbrt(double a) {
return StrictMath.cbrt(a);
}
public static double IEEEremainder(double f1, double f2) {
return StrictMath.IEEEremainder(f1, f2); // delegate to StrictMath
}
public static double atan2(double y, double x) {
return StrictMath.atan2(y, x); // default impl. delegates to StrictMath
}
public static double pow(double a, double b) {
return StrictMath.pow(a, b); // default impl. delegates to StrictMath
}
public static double sinh(double x) {
return StrictMath.sinh(x);
}
public static double cosh(double x) {
return StrictMath.cosh(x);
}
public static double tanh(double x) {
return StrictMath.tanh(x);
}
public static double hypot(double x, double y) {
return StrictMath.hypot(x, y);
}
public static double expm1(double x) {
return StrictMath.expm1(x);
}
public static double log1p(double x) {
return StrictMath.log1p(x);
}
}
public final class StrictMath {
private StrictMath() {}
public static final double E = 2.7182818284590452354;
public static final double PI = 3.14159265358979323846;
public static native double sin(double a);
public static native double cos(double a);
public static native double tan(double a);
public static native double asin(double a);
public static native double acos(double a);
public static native double atan(double a);
public static strictfp double toRadians(double angdeg) {
// Do not delegate to Math.toRadians(angdeg) because
// this method has the strictfp modifier.
return angdeg / 180.0 * PI;
}
public static strictfp double toDegrees(double angrad) {
// Do not delegate to Math.toDegrees(angrad) because
// this method has the strictfp modifier.
return angrad * 180.0 / PI;
}
public static native double exp(double a);
public static native double log(double a);
public static native double log10(double a);
public static native double sqrt(double a);
public static native double cbrt(double a);
public static native double IEEEremainder(double f1, double f2);
public static native double atan2(double y, double x);
public static native double pow(double a, double b);
public static native double sinh(double x);
public static native double cosh(double x);
public static native double tanh(double x);
public static native double hypot(double x, double y);
public static native double expm1(double x);
public static native double log1p(double x);
}