2011-12-27 29 views
5

Considere el caso en el que desea probar todos los posibles valores de entrada. Crear un caso en el que pueda iterar sobre todas las entradas posibles es bastante fácil, ya que puede incrementar el valor en 1 y repetir.Iterar sobre todos los valores dobles posibles

¿Qué harías al hacer esta misma idea para todos los valores dobles posibles?

+1

Bueno, desde ya se puede repetir todas las posibles int, simplemente repetir un conjunto que consta de todas las posibles/cada posible int int. – asawyer

+2

Por supuesto, usted se da cuenta de que hay demasiados dobles (o anhelos en el caso de los enteros) para probarlos todos. –

+3

¿Dónde necesita exactamente implementar tal concepto? – Lion

Respuesta

11

Puede iterar sobre todos los valores long posibles y luego usar Double.longBitsToDouble() para obtener un double para cada posible combinación de 64 bits.

Sin embargo, tenga en cuenta que esto llevará un tiempo. Si necesita 100 nanosegundos de procesamiento para cada valor de double, tomará aproximadamente (no todas las combinaciones de bits son números dobles diferentes, por ejemplo NaN) 2^64 * 1e-7/86400/365 años que es más que 16e11/86400/365 = 50700 años en una sola CPU. A menos que tenga un centro de datos para hacer el cálculo, es una mejor idea revisar el rango posible de todos los valores de entrada que muestren el intervalo en un número configurable de puntos.

Hazaña análoga para float sigue siendo difícil pero realizable: suponiendo que necesita 10 milisegundos de procesamiento para cada valor de entrada necesita aproximadamente 2^32 * 1e-2/86400 = 497.1 días en una sola CPU. En este caso, usaría Float.intBitsToFloat().

+0

+1 pero tenga en cuenta que 'Double.longBitsToDouble()' también creará Infinity y (un montón de) NaN; probablemente desee probar –

0

La clase Double de Java le permite construir y desmontar valores dobles en sus partes constituyentes. Esto, y una comprensión de la doble representación, le permitirá al menos conceptualmente enumerar todos los dobles posibles. Es probable que descubras que hay demasiados.

0

hacer un bucle como:

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

pero como ya se explicó en la respuesta de Adán, que tomará mucho tiempo para funcionar.
(esto no creará ni NaN Infinity)

+0

'Double.MIN_VALUE' es en realidad el doble más pequeño ** mayor que 0 **, por lo que solo dará aproximadamente la mitad de los valores posibles. –

Cuestiones relacionadas