Подтвердить что ты не робот

В Scala, почему NaN не подбирается путем сопоставления шаблонов?

Мой метод выглядит следующим образом

  def myMethod(myDouble: Double): Double = myDouble match {
    case Double.NaN => ...
    case _ => ...
  }

Отладчик IntelliJ показывает NaN, но это не подбирается в моем сопоставлении с образцом. Существуют ли возможные случаи, когда я опускаю

4b9b3361

Ответ 1

Это общее правило, согласно которому сравниваются 64-битные числа с плавающей запятой в соответствии с IEEE 754 (не Scala или даже связанные с Java, см. NaN)

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

Идея состоит в том, что NaN - значение маркера для неизвестного или неопределенного. Сравнение двух неизвестных значений всегда должно давать false, поскольку они хорошо... неизвестны.


Если вы хотите использовать сопоставление образцов с NaN, попробуйте следующее:

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

Но я думаю, что совпадение шаблонов будет использовать строгое двойное сравнение, поэтому будьте осторожны с этой конструкцией.

Ответ 2

Вы можете написать экстрактор (обновленный в соответствии с комментарием bse):

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


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

Ответ 3

Томаш прав. Вместо этого вы должны использовать isNaN.

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