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)
托马斯是正确的。你应该改用isNaN。
scala> Double.NaN.isNaN
res0: Boolean = true
Run Code Online (Sandbox Code Playgroud)