2010-04-21 27 views
5

¿Cómo puedo enumerar todos los valores posibles de un tipo de datos de coma flotante? Puedo hacer esto usando una unión en C o C++, pero ¿será portátil?Iterar a través de todos los posibles valores de coma flotante

¿Cómo se puede hacer esto en otros idiomas? Javascript?

Supongamos que estoy usando esta iteración para asignar theta a sin(theta).

+0

¿Está de hecho tratando de crear una tabla de búsqueda de sin en javascript? Si es así, ¿por qué? –

+0

Solo necesita una tabla de búsqueda que cubra 0..PI/2. Todos los demás valores se pueden asignar a este rango (siempre que se ocupen de los signos, etc.). –

+0

No realmente Andreas, la pregunta surge de pura curiosidad ociosa. –

Respuesta

2

¿Cómo puedo enumerar todos los valores posibles de un tipo de datos de coma flotante?

Por bits haciendo girar el IEEE-754 representation de su valor en coma flotante, por un flotador que necesita 2^32 representaciones diferentes asumiendo 4 bytes por flotación requeriría 16 GB de memoria.

Supongo que necesita una tabla de búsqueda para la función seno, simplemente realice un ciclo de 0 a 2 * PI en pasos de la precisión requerida.

+0

¿Cómo mezclar los bits de un tipo de datos de coma flotante? –

+0

Al usar binary y (&) y shift (>>) para extraer exponente y mantisa, incrementar la mantisa para asemejar los componentes con binary o (|). Honestamente espero que no hagas eso. En este applet puedes solos bits en IEEE754 http://www.h-schmidt.net/FloatApplet/IEEE754.html – stacker

+1

@stacker, twiddle_float.c (6): error C2296: '>>': ilegal, el operando izquierdo tiene tipo 'float' –

0

No puedo pensar en una forma portátil de hacerlo. Pero dada una representación de 64 bits (estándar IEEE doble) y suponiendo que generar un valor llevaría un nanosegundo, tomaría más de 500 años generar todos los valores posibles. Así que tiene mucho tiempo para pensar en un algoritmo :) ...

1

El enfoque de unión no es del todo portátil. Depende del tamaño de los tipos que uses. (Si sizeof (your_fp_type)> sizeof (your_int_type), entonces no podrá iterar en todo el rango, incluso si tuviera el tiempo).

De cualquier manera que vaya, tenga en cuenta que los posibles valores de coma flotante no están distribuidos uniformemente a través del rango del tipo que elijas. La diferencia entre los valores aumenta a medida que se aleja de 0. Teniendo en cuenta eso, y el tiempo que llevaría generar una lista así, y el hecho de que ni siquiera tiene suficiente espacio en HD para representar cada doble posible (lo garantizo) ¡no!), y mucho menos RAM ... Tengo que cuestionar el valor de crear una lista así. Buscar el valor tomaría más tiempo que solo hacer el cálculo.

5

Eche un vistazo a las páginas man para nextafter() y nextafterf(). Le permiten avanzar desde un número de coma flotante al siguiente más cercano. Puede usar uno de estos para visitar cada número FP en orden.

0

Además de nextafter(), también hay ldexp() and frexp() para tratar explícitamente a mantisa y exponente.

Cuestiones relacionadas