From 592e6582b3f5adc0261fb08d8b3d1f69ff4df09a Mon Sep 17 00:00:00 2001 From: Ilya Gorbunov Date: Fri, 17 Apr 2015 17:39:57 +0300 Subject: [PATCH] Provide isInfinite() and isFinite() functions for Double and Float. #KT-7126 Fixed --- libraries/stdlib/src/kotlin/util/Numbers.kt | 23 +++++++++++- libraries/stdlib/test/numbers/NumbersTest.kt | 37 ++++++++++++++++++++ 2 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 libraries/stdlib/test/numbers/NumbersTest.kt diff --git a/libraries/stdlib/src/kotlin/util/Numbers.kt b/libraries/stdlib/src/kotlin/util/Numbers.kt index bb80c7ad588..686d1dca0cd 100644 --- a/libraries/stdlib/src/kotlin/util/Numbers.kt +++ b/libraries/stdlib/src/kotlin/util/Numbers.kt @@ -10,4 +10,25 @@ public fun Double.isNaN(): Boolean = this != this * Returns `true` if the specified number is a * Not-a-Number (NaN) value, `false` otherwise. */ -public fun Float.isNaN(): Boolean = this != this \ No newline at end of file +public fun Float.isNaN(): Boolean = this != this + +/** + * Returns `true` if this value is infinitely large in magnitude. + */ +public fun Double.isInfinite(): Boolean = this == Double.POSITIVE_INFINITY || this == Double.NEGATIVE_INFINITY + +/** + * Returns `true` if this value is infinitely large in magnitude. + */ +public fun Float.isInfinite(): Boolean = this == Float.POSITIVE_INFINITY || this == Float.NEGATIVE_INFINITY + +/** + * Returns `true` if the argument is a finite floating-point value; returns `false` otherwise (for `NaN` and infinity arguments). + */ +public fun Double.isFinite(): Boolean = !isInfinite() && !isNaN() + +/** + * Returns `true` if the argument is a finite floating-point value; returns `false` otherwise (for `NaN` and infinity arguments). + */ +public fun Float.isFinite(): Boolean = !isInfinite() && !isNaN() + diff --git a/libraries/stdlib/test/numbers/NumbersTest.kt b/libraries/stdlib/test/numbers/NumbersTest.kt new file mode 100644 index 00000000000..307d3210bc3 --- /dev/null +++ b/libraries/stdlib/test/numbers/NumbersTest.kt @@ -0,0 +1,37 @@ +package numbers + +import org.junit.Test as test +import kotlin.test.* + +class NumbersTest { + + test fun doubleProperties() { + for (value in listOf(1.0, 0.0)) + doTestNumber(value) + for (value in listOf(Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY)) + doTestNumber(value, isInfinite = true) + doTestNumber(Double.NaN, isNaN = true) + } + + test fun floatProperties() { + for (value in listOf(1.0F, 0.0F)) + doTestNumber(value) + for (value in listOf(Float.POSITIVE_INFINITY, Float.NEGATIVE_INFINITY)) + doTestNumber(value, isInfinite = true) + doTestNumber(Float.NaN, isNaN = true) + } + + + private fun doTestNumber(value: Double, isNaN: Boolean = false, isInfinite: Boolean = false) { + assertEquals(isNaN, value.isNaN(), "Expected $value to have isNaN: $isNaN") + assertEquals(isInfinite, value.isInfinite(), "Expected $value to have isInfinite: $isInfinite") + assertEquals(!isNaN && !isInfinite, value.isFinite()) + } + + private fun doTestNumber(value: Float, isNaN: Boolean = false, isInfinite: Boolean = false) { + assertEquals(isNaN, value.isNaN(), "Expected $value to have isNaN: $isNaN") + assertEquals(isInfinite, value.isInfinite(), "Expected $value to have isInfinite: $isInfinite") + assertEquals(!isNaN && !isInfinite, value.isFinite()) + } + +} \ No newline at end of file