在Scala中,为什么NaN没有被模式匹配所吸引?

del*_*ber 30 scala nan pattern-matching ieee-754

我的方法如下

  def myMethod(myDouble: Double): Double = myDouble match {
    case Double.NaN => ...
    case _ => ...
  }
Run Code Online (Sandbox Code Playgroud)

IntelliJ调试器显示NaN但在我的模式匹配中没有获取.有可能我省略的情况

Tom*_*icz 45

根据IEEE 754(不是Scala甚至Java相关,请参阅NaN),如何比较64位浮点数是一般规则:

double n1 = Double.NaN;
double n2 = Double.NaN;
System.out.println(n1 == n2);     //false
Run Code Online (Sandbox Code Playgroud)

这个想法是未知不确定NaN的标记值.比较两个未知值应始终产生,因为它们很好......未知.false


如果你想使用模式匹配NaN,试试这个:

myDouble match {
    case x if x.isNaN => ...
    case _ => ...
}
Run Code Online (Sandbox Code Playgroud)

但我认为模式匹配将使用严格的双重比较,所以要小心这个结构.


Lan*_*dei 12

你可以写一个提取器(根据bse的评论更新):

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


0.0/0.0 match {
  case NaN() => println("NaN")
  case x => println("boring " + x)
}
//--> NaN
Run Code Online (Sandbox Code Playgroud)

  • 提取器可以更简单:`object NaN {def unapply(d:Double)= d.isNaN}`.它可以像这样使用:`0.0/0.0匹配{case NaN()=> print("NaN")}` (2认同)

ham*_*mar 5

托马斯是正确的。你应该改用isNaN

scala> Double.NaN.isNaN
res0: Boolean = true
Run Code Online (Sandbox Code Playgroud)