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
EDIT:
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.
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
}
You don't need to redefine anything. Just import with an alias:
import kotlin.Double.Companion.POSITIVE_INFINITY as inf
import kotlin.Double.Companion.NaN as nan
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With