2017-10-04 10 views
4

私が試した:Kotlinでコンパイル時定数NaNまたはPOSITIVE_INFINITYを作る方法は?

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

const val inf = POSITIVE_INFINITY 
const val nan = NaN 

をしかし、私は得る:

のConst 'ヴァル' 初期化子が一定値である必要があります


はEDIT:

私が必要とする理由これが原因Junit5's parametrized testsのある操作を行います。

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

により(this SO answerで説明)Javaアノテーション「アノテーションに渡す」物事のいくつかの制限にのみコンパイル時の定数することができます。したがって、コンパイル時にNaN、正、負の無限大が必要です。

答えて

5

、あなたは∞+ことはNaNと1.0/0.0すべき0.0/0.0 IEEE 754規格の保証という事実を使用することができます。

@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

何も再定義する必要はありません。ただ、import with an alias:回避策として

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

は、あなたの答えをありがとう、この私の問題は解決しません。これらの値をコンパイル時定数にする必要があります。そのため、Javaアノテーションでこれらの値を使用できます。 –

+0

@MartinDrozdik興味深いことに、あなたのユースケースを質問で分かち合うことができますか? – Ilya

+0

@Ilya確かに:)実世界のユースケースを含めるように私の質問を拡張しました。 –

関連する問題