5

I tried:

import kotlin.Double.Companion.POSITIVE_INFINITY
import kotlin.Double.Companion.NaN

const val inf = POSITIVE_INFINITY
const val nan = NaN

But I get:

Const 'val' initializer should be a constant value

The reason I need to do this is because of Junit5's parametrized tests:

 @ParameterizedTest
 @ValueSource(doubles = doubleArrayOf(nan, inf, -2* epsilon,  1.5, -0.5, 1.0 + 2* epsilon))
 fun ensureNotAProbability(number: Double)
 {
     ...
 }  

Due to some limitations of Java annotations (described in this SO answer) the things 'passed to an annotation' can only be compile-time constants. Therefore I would need a compile time NaN, positive, and negative infinities.

Michael
  • 41,989
  • 11
  • 82
  • 128
Martin Drozdik
  • 12,742
  • 22
  • 81
  • 146

1 Answers1

9

As a workaround, you can use the fact that the IEEE 754 standard guarantees 0.0 / 0.0 to be NaN and 1.0 / 0.0 to be +∞:

@Suppress("DIVISION_BY_ZERO")
const val NAN: Double = 0.0 / 0.0

@Suppress("DIVISION_BY_ZERO")
const val INFINITY: Double = 1.0 / 0.0

fun main(args: Array<String>) {
    println(NAN) // NaN
    println(INFINITY) // Infinity
} 
hotkey
  • 140,743
  • 39
  • 371
  • 326