2011-12-27 40 views
5

Xem xét trường hợp bạn muốn kiểm tra mọi giá trị đầu vào có thể có. Tạo một trường hợp mà bạn có thể lặp qua tất cả các int có thể là khá dễ dàng, vì bạn chỉ có thể tăng giá trị bằng 1 và lặp lại.Lặp lại tất cả giá trị có thể gấp đôi

Bạn sẽ thực hiện ý tưởng tương tự này cho tất cả các giá trị gấp đôi có thể như thế nào?

+1

Vì bạn đã có thể lặp lại mọi int có thể, chỉ cần lặp lại tập hợp bao gồm mọi int có thể có/int. – asawyer

+2

Tất nhiên bạn nhận ra rằng có quá nhiều cặp đôi khác biệt (hoặc dài trong trường hợp số nguyên) để thực sự thử tất cả. –

+3

Trường hợp chính xác bạn cần phải thực hiện một khái niệm như vậy? – Lion

Trả lời

11

Bạn có thể lặp qua tất cả các giá trị có thể long và sau đó sử dụng Double.longBitsToDouble() để nhận được double cho mỗi kết hợp 64 bit có thể.

Lưu ý rằng việc này sẽ mất một lúc. Nếu bạn yêu cầu 100 nano giây xử lý cho mỗi giá trị double thì sẽ mất khoảng (không phải tất cả các kết hợp bit là các số kép khác nhau, ví dụ: NaN) 2^64 * 1e-7/86400/365 năm, nhiều hơn 16e11/86400/365 = 50700 năm trên một CPU. Trừ khi bạn có một trung tâm dữ liệu để thực hiện tính toán, tốt hơn là nên đi qua phạm vi có thể có của tất cả các giá trị đầu vào lấy mẫu khoảng thời gian tại một số điểm có thể cấu hình.

Điểm tương tự cho float vẫn khó nhưng có thể thực hiện được: giả sử bạn cần 10 mili giây cho mỗi giá trị đầu vào bạn cần khoảng 2^32 * 1e-2/86400 = 497,1 ngày trên một CPU. Bạn sẽ sử dụng Float.intBitsToFloat() trong trường hợp này.

+0

+1 nhưng lưu ý rằng 'Double.longBitsToDouble()' cũng sẽ tạo ra Infinity và (rất nhiều) NaN - có thể mong muốn thử nghiệm –

0

Lớp Java Double cho phép bạn xây dựng và tách rời các giá trị kép thành các phần cấu thành của nó. Điều này, và một sự hiểu biết về đại diện kép, sẽ cho phép bạn ít nhất là khái niệm để liệt kê tất cả các đôi có thể. Bạn sẽ có thể thấy rằng có quá nhiều mặc dù.

0

làm một vòng lặp như:

for (double v = Double.MIN_VALUE; v <= Double.MAX_VALUE; v = Math.nextUp(v)) { 
    // ... 
} 

nhưng như đã giải thích trong câu trả lời của Adam, nó sẽ mất nhiều thời gian để chạy.
(điều này sẽ không tạo NaN lẫn Infinity)

+0

'Double.MIN_VALUE' thực sự là đôi nhỏ nhất ** lớn hơn 0 **, do đó, điều này sẽ chỉ cung cấp khoảng một nửa giá trị có thể. –

Các vấn đề liên quan