2010-04-21 14 views
5

Jak wyświetlić listę wszystkich możliwych wartości typu danych zmiennoprzecinkowych? Mogę to zrobić za pomocą unii w C lub C++, ale czy będzie to przenośne?Powtórzenie wszystkich możliwych wartości zmiennoprzecinkowych

Jak można to zrobić w innych językach? JavaScript?

Załóżmy, że używam tej iteracji do mapowania theta na sin(theta).

+0

Czy rzeczywiście próbujesz zbudować tabelę odnośników do grzechu w javascriptie, jeśli tak, dlaczego? –

+0

Potrzebujesz tylko tabeli odnośników, która obejmuje 0..PI/2. Wszystkie pozostałe wartości można odwzorować do tego zakresu (o ile zajmiesz się znakami itp.). –

+0

Naprawdę nie Andreas, pytanie wynika z czystej, bezczynnej ciekawości. –

Odpowiedz

2

Jak wyświetlić listę wszystkich możliwych wartości typu danych zmiennoprzecinkowych?

Poprzez bit kręci się IEEE-754 representation swojej wartości float, dla pływaka potrzeba 2^32 różnych przedstawień zakładając 4 bajty na pływaka wymagałoby 16GB pamięci.

Zakładam, że potrzebna jest tablica przeglądowa dla funkcji sinusoidalnej, wystarczy zapętlić od 0 do 2 * PI w krokach wymaganej dokładności.

+0

Jak przekodować bity typu danych zmiennoprzecinkowych? –

+0

Używając binarnego i (&) i przesunięć (>>) do wyodrębnienia wykładnika i mantysy, inkrementacja mantysy asemmbling komponentów binarnie lub (|). Szczerze mam nadzieję, że tego nie zrobisz. W tym aplecie możesz pojedynczych bitów w IEEE754 http://www.h-schmidt.net/FloatApplet/IEEE754.html – stacker

+1

@stacker, twiddle_float.c (6): błąd C2296: ">>": nielegalny, lewy operand ma type 'float' –

0

Nie mogę wymyślić przenośnego sposobu na zrobienie tego. Ale biorąc pod uwagę 64-bitową reprezentację (standardowe podwójne IEEE) i zakładając, że wygenerowanie jednej wartości zajmie jedną nanosekundę, wygenerowanie wszystkich możliwych wartości zajęłoby ponad 500 lat. Masz więc mnóstwo czasu na przemyślenie algorytmu :) ...

1

Podejście unii nie jest całkiem przenośne. To zależy od rozmiaru dowolnego typu. (Jeśli sizeof (your_fp_type)> sizeof (your_int_type), to nie będziesz w stanie przerwać całego zakresu, nawet jeśli miałeś czas.)

Tak czy inaczej, zdaj sobie sprawę, że możliwe wartości zmiennoprzecinkowe nie są równomiernie rozmieszczone w zakresie dowolnego rodzaju. Różnica między wartościami zwiększa się wraz z odejściem od 0. Biorąc to pod uwagę oraz czas potrzebny na wygenerowanie takiej listy oraz fakt, że nie masz wystarczająco dużo miejsca w HD, aby reprezentować każde możliwe podwójne (gwarantuję nie!), nie mówiąc już o RAM ... Muszę zakwestionować wartość tworzenia takiej listy. Szukanie wartości zajęłoby więcej czasu niż wykonanie obliczeń.

5

Spójrz na strony podręcznika dla funkcji nextafter() i nextafterf(). Pozwalają ci przejść od liczby zmiennoprzecinkowej do następnej. Możesz użyć jednego z nich, aby odwiedzić każdy numer FP w kolejności.

Powiązane problemy