如何在Kotlin中使编译时间常量为NaN或POSITIVE_INFINITY?

时间:2017-10-04 13:10:22

标签: kotlin

我试过了:

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

const val inf = POSITIVE_INFINITY
const val nan = NaN

但我明白了:

  

Const'val'初始值设定项应为常量值

修改

我需要这样做是因为Junit5's parametrized tests

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

由于Java注释的某些限制(在this SO answer中描述),传递给注释的东西只能是编译时常量。因此,我需要编译时NaN,正数和负数无穷大。

2 个答案:

答案 0 :(得分:5)

作为一种解决方法,您可以使用以下事实:IEEE 754标准保证0.0 / 0.0为NaN,1.0 / 0.0为+∞:

@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
} 

答案 1 :(得分:2)

您无需重新定义任何内容。只需import with an alias

import kotlin.Double.Companion.POSITIVE_INFINITY as inf
import kotlin.Double.Companion.NaN as nan