web-dev-qa-db-ja.com

math.minは実際にどのように機能しますか?

Javaのすべての数学関数が組み込まれていることを理解しています。しかし、好奇心からMath.min()が実際にどのように機能するのか疑問に思いました。

Javaのドキュメントを確認しましたが、役立つものが見つかりませんでした。Javaはまったく初めてです。

10

int

public static int min(int a, int b) {
    return (a <= b) ? a : b;
}

長いです

public static long min(long a, long b) {
     return (a <= b) ? a : b;
}

float

public static float min(float a, float b) {
    if (a != a) return a;   // a is NaN
    if ((a == 0.0f) && (b == 0.0f) && (Float.floatToIntBits(b) == negativeZeroFloatBits)) {
         return b;
    }
    return (a <= b) ? a : b;
 }

ダブル

public static double min(double a, double b) {
    if (a != a) return a;   // a is NaN
    if ((a == 0.0d) && (b == 0.0d) && (Double.doubleToLongBits(b) == negativeZeroDoubleBits)) {
        return b;
    }
    return (a <= b) ? a : b;
}

詳細: ここ

18
Gray

Java 7ドキュメント

2つのint値のうち小さい方を返します。つまり、結果は引数がInteger.MIN_VALUEの値に近くなります。引数の値が同じである場合、結果は同じ値になります。

動作

Math.min(1, 2) => 1
Math.min(1F, 2) => 1F
Math.min(3D, 2F) => 2D
Math.min(-0F, 0F) => -0F
Math.min(0D, -0D) => -0D
Math.min(Float.NaN, -2) => Float.NaN
Math.min(-2F, Double.NaN) => Double.NaN

Java.lang.MathおよびJava.lang.StrictMathソース

public static int min(int a, int b) {
    return (a <= b) ? a : b;
}

Java.lang.Mathバイトコード(javap -c Math.class OracleのJDKのJREのrt.jar)

public static int min(int, int);
Code:
   0: iload_0           // loads a onto the stack
   1: iload_1           // loads b onto the stack
   2: if_icmpgt     9   // pops two ints (a, b) from the stack
                        // and compares them
                        // if b>a, the jvm continues at label 9
                        // else, at the next instruction, 5
                        // icmpgt is for integer-compare-greater-than
   5: iload_0           // loads a onto the stack
   6: goto          10  // jumps to label 10
   9: iload_1           // loads 
  10: ireturn           // returns the currently loaded integer

5での比較が真の場合、aがロードされ、比較の結果がfalseの場合、jvmは10にジャンプし、aを返します。 、9にジャンプし、ロードしてbを返します。

組み込み関数

この.hppファイル Java 8 Hotspot JVMは、最適化されたマシンコードでMath.minをさらに最適化することを示唆しています。

do_intrinsic(_min, Java_lang_Math, min_name, int2_int_signature, F_S)

これは、上記のバイトコードがJava 8 Hotspot JVMによって実行されないことを意味します。ただし、これはJVMごとに異なります。そのため、バイトコードについても説明しました。

うまくいけば、Math.minについて知っておくべきことがすべてわかったはずです。 :)

10
tilpner

Math.Javaソースファイル を確認してください:

public static int min(int a, int b) {
    return (a <= b) ? a : b;
}
3
xlecoustillier

参照

Java.lang.Math.min(int a、int b)は、2つのint値のうち小さい方を返します。つまり、結果は負の無限大に近い値になります。引数の値が同じである場合、結果は同じ値になります。いずれかの値がNaNの場合、結果はNaNになります。数値比較演算子とは異なり、この方法では、負のゼロは正のゼロよりも厳密に小さいと見なされます。一方の引数が正のゼロで、もう一方が負のゼロの場合、結果は負のゼロになります。

例えば

_System.out.println(Math.min(1111, 1000));
_

として出力

_1000
_

Math.min()からの最小値を表示します

のいくつかの効率的な形式

math.min(a,b) = public static int min (a, b) {
  if(a<=b) return a;
  else return b;
}
2
Ruben Serrate