MathクラスとクラスStrictMath詳細なソース
クラス定義
public final class Math {
}
public final class StrictMath {
}
変更され、最終的なクラスは、それはあなた自身のサブクラスを持つことができないことを、継承することはできません
Mathクラスには、いくつかの三角関数を提供します
コントラスト
public static double sin(double a) {
return StrictMath.sin(a); // default impl. delegates to StrictMath
}
public static native double sin(double a);
Javaプラットフォームは、ユーザーとネイティブCコードAPIの相互運用性を持っている、Javaネイティブ・インターフェース(Javaネイティブ・インターフェース)と呼ばれます。
Javaのを呼び出すために、このメソッドは、ネイティブ関数であることを、この方法では、C / C ++言語を使用することで、DLLとしてコンパイルされるネイティブのキーワード説明を使用してください。
DLL、JDKのソースコード内のこれらの機関の機能が含まれていない、あなたが見るべきではありません実現。異なるプラットフォームのために、彼らはまた異なっています。これは、Javaの基本的なメカニズムであり、Javaは、実際のオペレーティングシステムへのアクセスを実現するために、異なるプラットフォーム上の異なるネイティブメソッドを呼び出しています。
二つの最も本質的な違いの-strictfp
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 double toRadians(double angdeg) {
return angdeg / 180.0 * PI;
}
strictfpの説明:
床とfloorMod方法について
public static double ceil(double a) {
return StrictMath.ceil(a); // default impl. delegates to StrictMath
}
public static double floor(double a) {
return StrictMath.floor(a); // default impl. delegates to StrictMath
}
public static double ceil(double a) {
return floorOrCeil(a, -0.0, 1.0, 1.0);
}
public static double floor(double a) {
return floorOrCeil(a, -1.0, 0.0, -1.0);
}
private static double floorOrCeil(double a,
double negativeBoundary,
double positiveBoundary,
double sign) {
int exponent = Math.getExponent(a);
if (exponent < 0) {
/*
* Absolute value of argument is less than 1.
* floorOrceil(-0.0) => -0.0
* floorOrceil(+0.0) => +0.0
*/
return ((a == 0.0) ? a :
( (a < 0.0) ? negativeBoundary : positiveBoundary) );
} else if (exponent >= 52) {
/*
* Infinity, NaN, or a value so large it must be integral.
*/
return a;
}
// Else the argument is either an integral value already XOR it
// has to be rounded to one.
assert exponent >= 0 && exponent <= 51;
long doppel = Double.doubleToRawLongBits(a);
long mask = DoubleConsts.SIGNIF_BIT_MASK >> exponent;
if ( (mask & doppel) == 0L )
return a; // integral value
else {
double result = Double.longBitsToDouble(doppel & (~mask));
if (sign*a > 0.0)
result = result + sign;
return result;
}
}
Math.pow = Y(2、X)に対応するx = Math.getExponent(y)は、X ^ 2
(1)ダブルMath.getExponent =指数部; //公平指数を
引数が無限大またはNaNである場合、結果はフロートであります.MAX_EXPONENT + 1。
パラメータがゼロまたは通常よりも小さい場合、結果はFloat.MIN_EXPONENT-1です。
0と0Lについて
Javaのメモリシステム
例:
ロングFW = 10000000000L、
実際に専用メモリ型変数FW長く、その値がスタック(スタック)、ヒープを指し(スタック)の実記憶の別の部分に格納されていない現在では、ありますメモリ、プラスLの目的の値は、ヒープがプット値に必要なメモリの長いタイプを作成できるようにすることです。
前と後の両方が=は、実際には二つの異なるメモリであるが、両者を接続するための目に見えないポインタがあると言ったので。
影響なし:
- Lのデフォルトがint、intは安全であると長い間にあるがなければ、それは自動的にコンパイルすることができ、電源を入れます
- それは自動的に切り替えないのでFなしのフロートは、コンパイラパスダブルデフォルトタイプ、精度の二重のターンフロート損失の可能性あり
- 範囲がintプラスLを超えていない場合は、エラーを指示します
public static int floorMod(int x, int y) {
int r = x - floorDiv(x, y) * y;
return r;
}
public static long floorMod(long x, long y) {
return x - floorDiv(x, y) * y;
}
public static int floorDiv(int x, int y) {
int r = x / y;
// if the signs are different and modulo not zero, round down
if ((x ^ y) < 0 && (r * y != x)) {
r--;
}
return r;
}
Javaは、モードがMath.floorMod(配当、除数)メソッドを使用シーク
得られた同じ被除数と除数の数、残りのモジュロ結果が等しい場合
プロセスの残りの部分商を商の絶対値を用いて得られた正または負の数に加算されます
プロセスモジュロ商は、アリコートを絶対値で除算値以外+1符号を取得し、追加されます。
残りのプロセス:
I符号は正と負の配当に比べ、被除数が正で、被除数の数に依存する負であります
モジュロ・プロセス:
ダイ符号が正と比較して、除数が正で、除数に依存し、除数が負のために責任があります
public static int abs(int a) {
return (a < 0) ? -a : a;
}
public static float abs(float a) {
return (a <= 0.0F) ? 0.0F - a : a;
}
public static double abs(double a) {
return (a <= 0.0D) ? 0.0D - a : a;
}
public static int max(int a, int b) {
return (a >= b) ? a : b;
}
public static float max(float a, float b) {
if (a != a)
return a; // a is NaN
if ((a == 0.0f) &&
(b == 0.0f) &&
(Float.floatToRawIntBits(a) == negativeZeroFloatBits)) {
// Raw conversion ok since NaN can't map to -0.0.
return b;
}
return (a >= b) ? a : b;
}