0

以下のコードが壊れている理由を見つけることができないようです:

私の観点からは、整数lbndが減少するということです

public class Test {
    public static void main(String[] args) {
        methode1();
    }
    static void methode1() {
        int ubnd = Integer.MAX_VALUE;
        int lbnd = ubnd;

        while ((float)lbnd == (float)ubnd) {
            --lbnd;
        }   
        System.out.println((++lbnd) + ".." + ubnd);
    }
}

問題は、このループは私が見る限り無限ループである必要があるということですが、int の値が変更されたため、64 ループ後に中断されます。結果は次のとおりです。

2147483584..2147483647

ただし、次の無限ループにする必要があります。

2147483647..2147483647

4

4 に答える 4

2

float には、整数の 32 ビットすべてを正確に格納するのに十分な精度がないことに注意してください。したがって、大きさの大きい整数の場合、(float) i と (float) (i-1) は、float 比較の目的では同一です。

(ちなみに、int と float を比較するときは、float 比較として扱われます。したがって、追加の問題を説明するために、キャストを == 比較の片側に浮動させる必要さえありません。)

于 2012-11-18T21:45:19.813 に答える
0

Neil Coffey の優れた回答を確認するには、追加の出力を使用してコードの出力を確認できます。

   while ((float)lbnd == (float)ubnd) {
        System.out.println(
                "Lower Int " + lbnd 
                + " Lower Float " + (float)lbnd 
                + " .. Upper Int " + ubnd
                + " Upper Float "+ (float)ubnd);
        --lbnd;
    }   
    System.out.println((++lbnd) + ".." + ubnd);
于 2012-11-18T21:47:42.957 に答える
0

大きな int の場合、複数の int のブロックがすべて同じ float に丸められるため、最初の数回の反復では、lbnd の float 変換は ubnd の float 変換と同じままです。

lbnd から十分な int 減算を行った後、次に小さい float 値にマップするのに十分なほど小さくなり、2 つの float 変換が異なり、ループが終了します。

于 2012-11-18T21:48:43.467 に答える
0

lbnd をデクリメントおよびインクリメントしています。これは、1 の違いを示します。1 つは 16777217 の数値まで (strictfp 浮動小数点で) のみ意味があります。VM の精度が高い (strictfp ではない) 場合は、数値が高くなる可能性があります。

于 2012-11-18T21:55:42.373 に答える