2

私は昨日インタビューを受けました、そしてこの質問が起こります:

public class Main {

    public static void main(String[] args) {

        // Code fragment must prints true if the double variables x and y are both
        // strictly between 0 and 1 and false otherwise. 

        // Assuming args will be always correct (double) input, 
        // Where's the safety bug?

        double x,y;

        x = Double.parseDouble(args[0]);
        y = Double.parseDouble(args[1]);

        System.out.println( (0 < x && x < 1) && (0 < y && y < 1)? true : false );
    }
}

私はどこにもバグはないと書いた、つまり、コードは機能する。家に戻って、試してみましたが、実際に機能します。しかし、私は仕事を手に入れましたが、この質問は私の唯一の悪い質問であり、頭から離れることはできません(それは非常に単純です)。私は安全バグが何であるかさえ理解していないと信じています、それで私の質問は:

安全上のバグとは何ですか?このコードには実際にバグがありますか?

アップデート:

応答後、私はいくつかの関連リソースを置きました:

Eric LippertなぜJScriptに丸め誤差があるのですか?

4

3 に答える 3

3

ソースのコメントから判断すると:

argsが常に正しい(double)入力であると仮定すると、安全性のバグはどこにありますか?

プログラムが間違った出力を提供する場合があり、式自体を除いて疑わしいことはないようです。

(0 <x && x <1)&&(0 <y && y <1)

私はそれをテストしていませんが、この式がxまたはyのいずれかのエッジケースの1つ(NaN、+/-無限大、場合によっては-0.0)に直面すると、問題が発生する可能性があります。

また、数値がdoubleで表される精度が制限されているため、ユーザーの論理的期待に違反する可能性のある明確に有効な入力が存在します(たとえば、x = 1E-400は0より大きいが、0として解析されるため、式はfalseを配信しますユーザーはtrueを期待しますが)。

于 2012-09-06T17:48:21.873 に答える
0

入力がたまたまdoubleでない場合は、型安全性とキャッチされない例外を使用します。次に、コードは例外をスローします。

于 2012-09-06T17:27:27.633 に答える
0

xを0に設定し、yに0を入力できます。ただし、値はの間にある必要があります。

strictfpを使用することをお勧めします。0の代わりに0dを使用する方がよいでしょう。

于 2012-09-06T17:36:18.650 に答える