Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to make a compile time constant NaN or POSITIVE_INFINITY in Kotlin?

Tags:

kotlin

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.

like image 347
Martin Drozdik Avatar asked Oct 04 '17 13:10

Martin Drozdik


2 Answers

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
} 
like image 153
hotkey Avatar answered Oct 03 '22 21:10

hotkey


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
like image 25
Michael Avatar answered Oct 03 '22 21:10

Michael