ข้อเสียอย่างเดียวที่ฉันนึกได้คือเมื่อต้องรับมือกับคนจำนวนมากซึ่งจะล้นเมื่อกำลังสอง
ตัวอย่างเช่นใน Java:
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!
นอกจากนี้ยังควรสังเกตว่าเป็นสิ่งที่เกิดขึ้นเมื่อคุณใช้Math.pow ()ด้วยตัวเลขที่แน่นอนและโยนกลับไปที่ int จาก double ที่ส่งคืนจาก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!
มันใช้ได้ไหม? ไม่มีก็เพียงให้คำตอบที่ถูกต้องเพราะy*y
ยึดติดอยู่Integer.MAX_VALUE
และมีค่าน้อยกว่าx*x
Integer.MAX_VALUE
หากx*x
ถูกจับด้วยเช่นกันInteger.MAX_VALUE
คุณจะได้รับคำตอบที่ไม่ถูกต้อง
หลักการที่คล้ายกันนี้ใช้กับการลอยตัวและการดับเบิล (ยกเว้นว่าพวกเขามีช่วงกว้างกว่าก่อนที่จะล้น) และภาษาอื่น ๆ ที่อนุญาตให้มีการไหลล้นอย่างเงียบ ๆ