2010-04-21 21 views
5

Come posso elencare tutti i possibili valori di un tipo di dati a virgola mobile? Posso farlo usando un sindacato in C o C++ ma sarà portatile?Iterate attraverso tutti i possibili valori a virgola mobile

Come è possibile farlo in altre lingue? Javascript?

Supponiamo di utilizzare questa iterazione per mappare theta a sin(theta).

+0

Stai provando a costruire una tabella di ricerca per il peccato in javascript, in tal caso perché? –

+0

Hai solo bisogno di una tabella di ricerca che copra 0..PI/2. Tutti gli altri valori possono essere mappati su questo intervallo (a condizione che ci si prenda cura dei segni, ecc.). –

+0

Non proprio Andreas, la domanda nasce dalla pura e semplice curiosità. –

risposta

2

Come è possibile elencare tutti i valori possibili di un tipo di dati a virgola mobile?

da Bit-giocherellando l'IEEE-754 representation del valore float, per un galleggiante è necessario 2^32 diverse rappresentazioni assumendo 4 byte per float richiederebbe 16GB di memoria.

Presumo che sia necessaria una tabella di ricerca per la funzione seno, è sufficiente eseguire il ciclo da 0 a 2 * PI in passi della precisione richiesta.

+0

Come si twiddle i bit di un tipo di dati a virgola mobile? –

+0

Usando binario e (&) e turni (>>) per estrarre esponente e mantissa, la mantissa incrementale riemerge i componenti con binario o (|). Spero sinceramente che tu non lo faccia. In questa applet puoi inserire singoli bit in IEEE754 http://www.h-schmidt.net/FloatApplet/IEEE754.html – stacker

+1

@stacker, twiddle_float.c (6): errore C2296: '>>': illegale, l'operando di sinistra ha digita "float" –

0

Non riesco a pensare a un modo portatile per farlo. Ma data una rappresentazione a 64 bit (standard IEEE double) e assumendo che la generazione di un valore richiederebbe un nanosecondo ci vorrebbero più di 500 anni per generare tutti i valori possibili. Quindi hai un sacco di tempo per pensare ad un algoritmo :) ...

1

L'approccio sindacale non è del tutto portatile. Dipende dalle dimensioni di qualunque tipo tu usi. (Se sizeof (your_fp_type)> sizeof (your_int_type), non sarai in grado di scorrere l'intero intervallo, anche se avessi tempo.)

In entrambi i casi, rendi conto che i possibili valori a virgola mobile non sono distribuiti uniformemente nella gamma di qualsiasi tipo tu scelga. La differenza tra i valori aumenta man mano che ti allontani da 0. Considerando che, e il tempo necessario per generare un elenco di questo tipo, e il fatto che non hai nemmeno abbastanza spazio HD per rappresentare ogni possibile doppio (garantisco non lo fai!), per non parlare della RAM ... Devo mettere in discussione il valore della creazione di una tale lista. Cercare il valore richiederebbe più tempo del semplice calcolo.

5

Dai un'occhiata alle pagine man per nextafter() e nextafterf(). Ti permettono di avanzare da un numero in virgola mobile a quello successivo più vicino. È possibile utilizzare uno di questi per visitare ciascun numero FP in ordine.

0

Oltre allo nextafter(), ci sono anche ldexp() and frexp() per gestire esplicitamente la mantissa e l'esponente.

Problemi correlati