2012-06-14 13 views
7

Con i float a 32 bit, penso che ci siano qualcosa come 2^31 - 1 float rappresentabili. In java puoi prendere un float esistente e trovare il "next float" usando la libreria Math. Ma diciamo che non hai un float iniziale, c'è un modo per calcolare l'ennesimo float? Non mi interessa quale lingua, se ci sarà una lingua con una funzione di libreria, la prenderò.Calcola il decimo float

Ovviamente potrei semplicemente mettere tutti i float in una matrice e indicizzarli, ma quello è lo spazio inefficiente.

Ecco alcuni ulteriori chiarimenti. Potrei iniziare da Float.MIN e incrementare N volte usando nextFloat, ma questo sembra inefficiente perché ho bisogno di eseguire questa operazione molte volte.

+2

in Java, iniziare su Float.MIN_VALUE. –

+0

Devono essere in ordine? vale a dire. float n + 1> float n. Non vuoi semplicemente mappare [0..2^31) ai float? – weston

+0

@CarlManaster Funziona ma devi ripetere N volte per ottenere la risposta ... Sto cercando di pensare a un modo per connettere N alla rappresentazione binaria ma non penso che tu possa. Forse è la migliore risposta – evanmcdonnal

risposta

7

Dipende da come li vuoi ordinati. Tieni presente che non tutti i galleggianti sono ordinati a tutti; per esempio, una coppia di NaN distinti non sono ordinati (vale a dire, non sono uguali, ma nessuno dei due è maggiore dell'altro).

Se non ti dispiace finire con quelli, puoi semplicemente reinterpretare un numero intero come un float. Il modo in cui lo faresti varia da una lingua all'altra; ecco un'implementazione C:

float int_to_float(uint32_t in) { 
    union { 
     float f; 
     uint32_t i; 
    } u; 

    u.i = in; 
    return u.f; 
} 

Questo ha l'comoda proprietà di darvi lo più ordinato risultati - passando a zero si ottiene 0.0, quello che si ottiene 1.4e-45, 2 si ottiene 2.8e-45, e così sopra. I risultati cominceranno a diventare pazzi quando entrerai nei valori NaN/Inf e alla fine inizi diminuendo di dopo aver colpito 0x80000000 (-0,0), ma per ora dovrebbe essere abbastanza buono.

+0

C'è un modo per rilevare la condizione NaN? dai pezzi del galleggiante? O questo metodo darà sempre un valore float? –

+1

Quando un numero è NaN, i bit di esponente sono impostati su 0xFF (per i galleggianti a precisione singola). http://en.wikipedia.org/wiki/Single-precision_floating-point_format – steveha

+0

cosa risponde un ballerino, spero che tu possa lavorare in un posto carino. Grazie. –