Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Scala 2.10, Double.isNaN, and boxing

In Scala 2.10, is someDouble.isNaN expected to box? Running my code calling .isNaN through a decompiler, I still see telltale calls to double2Double in my code. Given the new AnyVal work in 2.10, I'd expect it to be no worse than java.lang.Double.isNaN(someDouble) at runtime with no spurious allocations. Am I missing something?

like image 206
Mysterious Dan Avatar asked Apr 19 '13 19:04

Mysterious Dan


1 Answers

Unfortunately, isNaN is a method on java.lang.Double, and it is essential to have an implicit conversion to java.lang.Double, so the Scala RichDouble value class cannot reimplement isNaN to be fast, and when you use isNaN you box to java.lang.Double.

Since this leaves only slow or awkward ways to test for NaN, I define

implicit class RicherDouble(val d: Double) extends AnyVal {
  def nan = java.lang.Double.isNaN(d)
}

and then I can just use .nan to check.

like image 183
Rex Kerr Avatar answered Nov 07 '22 04:11

Rex Kerr