2012-04-17 10 views
6

Tengo un método que necesita hacer algo diferente cuando se le da un float no fijo que un float con valor de 0. Básicamente, necesito verificar si una variable ha estado o no, contarla como set si tiene un valor de 0.¿Cómo puedo distinguir entre un flotante no ajustado y uno con un valor de 0?

por lo tanto, lo que marcador de posición se debe utilizar como un valor desarmar (nula, NULL, NO, etc.) y cómo puede probar para ver si una variable no está definida sin devolver cierto para un valor de 0 ?

+0

¿Por qué no NaN (digamos, 1.0/0.0)? Para comprobar si un flotante es NaN, es simplemente 'num! = Num' (NaN no es igual a nada, incluso a sí mismo). – cHao

+0

La adquisición de NaN por división por cero es peligrosa, ya que podría atrapar/generar una señalización NaN –

+0

¿Hay una manera mejor? No me he equivocado tanto con NaNs como para preocuparme por * generar * intencionalmente. :) Bastante seguro 'NaN' no funcionaría como un flotante literal ... – cHao

Respuesta

16

Puede inicializar sus flotadores a NaN (por ejemplo llamando nan() o nanf()) y luego probar con isnan() si se han cambiado para contener un número. (Tenga en cuenta que las pruebas myvalue == nan() se no trabajo.)

Esto es tanto más bien simple (es probable que incluya math.h en cualquier caso) y conceptualmente sensata: Cualquier valor que no se establece en un número "no es un número" ...

+5

¡Impresionante, gracias! Lo tengo trabajando con 'CGFloat myFloat = NAN;' y 'if (isnan (myFloat)) {...}'. – Nathan

+0

¡Es agradable de escuchar! –

+2

Otra opción para su caso específico sería usar MAXFLOAT. – Till

3

El uso de un valor constante para indicar el estado de desarmado a menudo conduce a errores cuando la variable legítimamente obtiene el valor de esa constante.

Considere usar NSNumber para almacenar su flotador. De esta forma, no solo puede ser nil, sino que se establecerá en ese estado por defecto.

Esto supone que solo necesita una pequeña cantidad de flotadores. Si necesita millones de ellos, NSNumber puede ser demasiado lento y requiere mucha memoria.

+0

Necesito hacer cálculos con estas carrozas, por lo que NSNumber no es ideal. Supongo que podría convertir temporalmente, pero eso parece costoso e innecesario. ¿Puedes ampliar los peligros de usar algo como NaN? – Nathan

+0

El peligro es si su flotador podría terminar asignado, pero manteniendo el valor NaN, para que su código lo trate como no asignado. Por supuesto, no deberías pasar ciegamente NaN a la mayoría de las rutinas matemáticas de todos modos. Si estos valores provienen del usuario, decirles que vuelvan a escribir cuando su entrada resultó en NaN también es lógico. – Dondragmer

2

En lugar de sobrecargar estas propiedades float (llamémoslas X e Y), cree un indicador isValid por separado para cada propiedad. Inicialice los indicadores para indicar que los flotantes no se han establecido, y proporcione sus propios configuradores para administrar los indicadores de forma adecuada. Así que el código podría ser algo como:

if (self.isXValid == YES) { 
    self.Y = ... // assigning to Y sets isYValid to YES 
} 
else if (self.isYValid == YES) { 
    self.X = ... // assigning to Y sets isXValid to YES 
} 

Usted podría ir un paso más allá y tienen la incubadora para X también asignar Y y viceversa. O bien, si X e Y están tan estrechamente vinculados que puede calcular uno basado en el valor del otro, realmente solo necesita una variable para ambas propiedades.

Cuestiones relacionadas