Mã này sẽ không bao giờ thoát khỏi vòng lặp.
Lý do cho điều này là thêm 1
một số double
đủ lớn không thay đổi giá trị của nó:
double a = 1.7976931348623155E308;
double old = a;
a++;
System.out.println(a); // prints 1.7976931348623155E308
System.out.println(old); // prints 1.7976931348623155E308
System.out.println(a==old); // prints "true"
Demo.
Trong thực tế, khi giá trị của double
được đủ gần đến vô cùng tích cực , bạn cần phải thêm một số trên 10 để tạo giá trị thay đổi lớn gấp đôi và trở thành POSITIVE_INFINITY
.
Lý do cho điều này là cách double
đại diện cho số lượng lớn. Nó sử dụng mantissa ngắn để biểu thị các chữ số có nghĩa nhất của giá trị và số mũ để chỉ ra vị trí đặt điểm thập phân. Trong trường hợp các số rất lớn, số mũ về cơ bản là một dấu hiệu cho biết có bao nhiêu số không cần phải được thêm vào sau khi biểu diễn nhị phân của mantissa.
Để làm cho giá trị thay đổi số double
của bạn thông qua bổ sung, bạn cần phải thêm một số ít nhất cũng lớn như bit ít quan trọng nhất của phần định trị. Khi số mũ nhị phân vượt quá 48, số nhỏ nhất mà bạn cần thêm để kết quả khác nhau trở thành 2, có nghĩa là ++
sẽ không còn thay đổi giá trị.
Tôi cho rằng không có gì đảm bảo rằng nó sẽ làm cho giá trị đó đạt được. Ai sẽ nói rằng 'i' sẽ không bị tràn trước khi bạn đạt tới giá trị đó do cách mà số học hai lần hoạt động? – Makoto
Tại sao không thử? – Grodriguez
@Makoto Đó là cơ bản những gì tôi yêu cầu. Trường hợp thú vị duy nhất ở đây là trường hợp cạnh. – Samir