Vì Chirag cho biết, các số nguyên ném ngoại lệ khi chúng tràn trong khi đôi không. Không được quá cụ thể, nhưng về cơ bản, gấp đôi bộ nhớ được lưu trữ rất giống với ký hiệu khoa học, trong đó chúng là số nguyên * 2^(một số sức mạnh), và do đó không bao giờ thực sự tràn nhưng nhân với 2^lớn hoặc nhỏ một số sức mạnh) mà họ hoàn toàn mất đi độ chính xác của họ. Vì vậy, thay vào đó bạn có thể nghĩ về tràn kép vì khi chúng hoàn toàn mất độ chính xác và được in dưới dạng Infinity
hoặc -Infinity
.
Vì vậy, bạn sẽ cần phải kiểm tra thủ công xem có xảy ra tình trạng tràn không bằng cách kiểm tra xem giá trị kết quả là Double.POSITIVE_INFINITY
hoặc Double.NEGATIVE_INFINITY
.
Dưới đây là một số mẫu mã để hiển thị những gì tôi muốn nói:
public static void main(String[] args) throws Exception
{
double a = Double.MAX_VALUE; // highest possible double
double b = Double.MAX_VALUE; // highest possible double
if (Math.pow(a, b) == Double.POSITIVE_INFINITY || Math.pow(a, b) == Double.NEGATIVE_INFINITY)
{
throw new ArithmeticException("Double Overflow");
}
}
Tôi nghĩ bạn cũng nên đề cập đến 'LongMath.checkedPow'. Tôi nghĩ (mặc dù tôi có thể sai) nó tầm thường đối với 'int' bởi vì mỗi' int' có thể được biểu diễn dưới dạng double, vì vậy bạn chỉ cần thực hiện 'Math.pow (a, b)' và so sánh với 'Integer.MAX_VALUE '. –
@Louis Nếu tôi sử dụng 'BigInteger' tôi không thể lo lắng về kích thước của số lượng thu được? – Claudia
@Claudia [BigInteger] (https://docs.oracle.com/javase/8/docs/api/java/math/BigInteger.html): "số nguyên chính xác tùy ý ... Tất cả chi tiết trong Thông số liên quan tràn được bỏ qua, như BigIntegers được thực hiện lớn như cần thiết để chứa các kết quả của một hoạt động. " –