Satu-satunya kelemahan yang bisa saya pikirkan adalah ketika berhadapan dengan angka besar yang akan meluap ketika kuadrat.
Misalnya, di Jawa:
int x = Integer.MAX_VALUE / 1000000; //2147
int y = Integer.MAX_VALUE / 5000; //429496
System.out.println("x < y: " + (x < y)); //true
System.out.println("x*x: " + (x * x)); //4609609
System.out.println("y*y: " + (y * y)); //-216779712 - overflows!
System.out.println("x*x < y*y: " + (x * x < y * y)); //false - incorrect result due to overflow!
Juga patut dicatat bahwa itulah yang terjadi ketika Anda menggunakan Math.pow () dengan angka yang sama persis dan melemparkan kembali ke int dari ganda yang dikembalikan dari Math.pow()
:
System.out.println("x^2: " + (int) (Math.pow(x, 2))); //4609609
System.out.println("y^2: " + (int) (Math.pow(y, 2))); //2147483647 - double to int conversion clamps to Integer.MAX_VALUE
System.out.println("x^2 < y^2: " + ((int) (Math.pow(x, 2)) < (int) (Math.pow(y, 2)))); //true - but for the wrong reason!
Apakah ini berhasil? Tidak , itu hanya memberikan jawaban yang benar karena y*y
dijepit Integer.MAX_VALUE
, dan x*x
kurang dari Integer.MAX_VALUE
. Jika x*x
juga dijepit Integer.MAX_VALUE
maka Anda akan mendapatkan jawaban yang salah.
Prinsip serupa juga berlaku dengan float & dobel (kecuali mereka jelas memiliki jangkauan lebih besar sebelum meluap) dan bahasa lain apa pun yang secara diam-diam memungkinkan luapan air.