2011-12-27 15 views
5

Rozważ przypadek, w którym chcesz przetestować każdą możliwą wartość wejściową. Tworzenie przypadku, w którym można wykonać iterację we wszystkich możliwych intach, jest dość łatwe, ponieważ można po prostu zwiększyć wartość o 1 i powtórzyć.Powtórzenie każdej możliwej podwójnej wartości

Co byś zrobił, wykonując ten sam pomysł dla wszystkich możliwych podwójnych wartości?

+1

No skoro już można iteracyjne każdą możliwą int, po prostu iteracyjne zestaw, który składa się z każdej możliwej INT/każdej możliwej int. – asawyer

+2

Oczywiście zdajesz sobie sprawę, że istnieje zbyt wiele różnych podwójnych (lub długich w przypadku liczb całkowitych), aby faktycznie wypróbować je wszystkie. –

+3

Gdzie dokładnie trzeba wdrożyć taką koncepcję? – Lion

Odpowiedz

11

Można iterować po wszystkich możliwych wartościach long, a następnie użyć Double.longBitsToDouble(), aby uzyskać double dla każdej możliwej kombinacji 64-bitowej.

Pamiętaj jednak, że to potrwa chwilę. Jeśli potrzebujesz 100 nanosekund przetwarzania dla każdej wartości double, to zajmie to mniej więcej (nie wszystkie kombinacje bitowe są różnymi liczbami podwójnymi, np. NaN) 2^64 * 1e-7/86400/365 lat, czyli więcej niż 16e11/86400/365 = 50 700 lat na pojedynczym procesorze. Jeśli nie masz centrum przetwarzania danych do wykonania obliczeń, lepszym rozwiązaniem jest zbadanie możliwego zakresu wszystkich wartości wejściowych próbkowania przedziału w konfigurowalnej liczbie punktów.

Analogiczny wyczyn dla float jest nadal trudny, ale możliwy do wykonania: zakładając, że potrzebujesz 10 milisekund przetwarzania dla każdej wartości wejściowej, którą potrzebujesz mniej więcej 2^32 * 1e-2/86400 = 497,1 dni na pojedynczym procesorze. W takim przypadku należy użyć Float.intBitsToFloat().

+0

+1, ale zauważ, że 'Double.longBitsToDouble()' utworzy także Infinity i (dużo) NaN - prawdopodobnie będzie chciał przetestować –

0

Klasa Java Double pozwala konstruować i rozdzielać wartości podwójne na elementy składowe. To i zrozumienie podwójnej reprezentacji pozwoli ci przynajmniej konceptualnie wyliczyć wszystkie możliwe duble. Prawdopodobnie okaże się, że jest ich za dużo.

0

zrobić pętlę jak:

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

ale jak już wyjaśniono w odpowiedzi Adama, potrwa długo, aby uruchomić.
(będzie ani tworzyć, ani NaN nieskończoność)

+0

'Double.MIN_VALUE' jest faktycznie najmniejszym podwójnym ** większym niż 0 **, więc to da tylko połowę możliwych wartości. –

Powiązane problemy