2011-08-02 11 views

Respuesta

43

Es una regla general, cómo los números de coma flotante de 64 bits se comparan de acuerdo con la norma IEEE 754 (no Scala o incluso Java relacionados, consulte NaN):

double n1 = Double.NaN; 
double n2 = Double.NaN; 
System.out.println(n1 == n2);  //false 

La idea es que NaN es un valor marcador para desconocido o indeterminado. La comparación de dos valores desconocidos siempre arroja false, ya que son bien ... desconocidos.


Si desea utilizar la coincidencia de patrones con NaN, intente esto:

myDouble match { 
    case x if x.isNaN => ... 
    case _ => ... 
} 

Pero creo que la coincidencia de patrones se utilizan estricta comparación doble así que tenga cuidado con esta construcción.

+0

+1 por señalar que 'NaN = NaN' en muchos (si no todos) los lenguajes de programación que exponen a esto! valor para el programador. –

+1

Tenga en cuenta que si la mayoría de los números no son NaN, '.isNaN' es solo la mitad de rápido que' java.lang.Double.isNaN', por lo que este último debería preferirse en bucles ajustados. (La coincidencia es tan rápida como una instrucción if.) Para mayor claridad (es decir, en todas partes, excepto en los lapsos críticos de rendimiento estricto), la forma '.isNaN' es probablemente la mejor. –

4

Tomasz es correcto. Deberías usar isNaN en su lugar.

scala> Double.NaN.isNaN 
res0: Boolean = true 
11

Puede escribir un extractor (actualizado de acuerdo con el comentario de la EEB):

object NaN { 
    def unapply(d:Double) = d.isNaN 
} 


0.0/0.0 match { 
    case NaN() => println("NaN") 
    case x => println("boring " + x) 
} 
//--> NaN 
+2

El extractor puede ser incluso más simple: 'objeto NaN {def unapply (d: Double) = d.isNaN}'. Se puede usar así: '0.0/0.0 coincidencia {caso NaN() => impresión (" NaN ")}' – bseibold

+0

@bse: Gracias, actualicé mi respuesta. – Landei

Cuestiones relacionadas