New ieee754 arithmetic, Fix for KT-14651: Floating point comparisons shall operate according to IEEE754
This commit is contained in:
@@ -0,0 +1,15 @@
|
||||
fun box(): String {
|
||||
val plusZero: Any = 0.0
|
||||
val minusZero: Any = -0.0
|
||||
if ((minusZero as Double) < (plusZero as Double)) return "fail 0"
|
||||
|
||||
val plusZeroF: Any = 0.0F
|
||||
val minusZeroF: Any = -0.0F
|
||||
if ((minusZeroF as Float) < (plusZeroF as Float)) return "fail 1"
|
||||
|
||||
if ((minusZero as Double) != (plusZero as Double)) return "fail 3"
|
||||
|
||||
if ((minusZeroF as Float) != (plusZeroF as Float)) return "fail 4"
|
||||
|
||||
return "OK"
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
// IGNORE_BACKEND: JS
|
||||
fun box(): String {
|
||||
if ((-0.0 as Comparable<Double>) >= 0.0) return "fail 0"
|
||||
if ((-0.0F as Comparable<Float>) >= 0.0F) return "fail 1"
|
||||
|
||||
|
||||
if ((-0.0 as Comparable<Double>) == 0.0) return "fail 3"
|
||||
if (-0.0 == (0.0 as Comparable<Double>)) return "fail 4"
|
||||
|
||||
if ((-0.0F as Comparable<Float>) == 0.0F) return "fail 5"
|
||||
if (-0.0F == (0.0F as Comparable<Float>)) return "fail 6"
|
||||
|
||||
return "OK"
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
// IGNORE_BACKEND: JS
|
||||
data class Test(val z1: Double, val z2: Double?)
|
||||
|
||||
fun box(): String {
|
||||
val x = Test(Double.NaN, Double.NaN)
|
||||
val y = Test(Double.NaN, Double.NaN)
|
||||
|
||||
return if (x == y) "OK" else "fail"
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
fun equals1(a: Double, b: Double) = a == b
|
||||
|
||||
fun equals2(a: Double?, b: Double?) = a!! == b!!
|
||||
|
||||
fun equals3(a: Double?, b: Double?) = a != null && b != null && a == b
|
||||
|
||||
fun equals4(a: Double?, b: Double?) = if (a is Double && b is Double) a == b else null!!
|
||||
|
||||
fun equals5(a: Any?, b: Any?) = if (a is Double && b is Double) a == b else null!!
|
||||
|
||||
|
||||
fun box(): String {
|
||||
if (-0.0 != 0.0) return "fail 0"
|
||||
if (!equals1(-0.0, 0.0)) return "fail 1"
|
||||
if (!equals2(-0.0, 0.0)) return "fail 2"
|
||||
if (!equals3(-0.0, 0.0)) return "fail 3"
|
||||
if (!equals4(-0.0, 0.0)) return "fail 4"
|
||||
if (!equals5(-0.0, 0.0)) return "fail 5"
|
||||
|
||||
return "OK"
|
||||
}
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
fun equals1(a: Float, b: Float) = a == b
|
||||
|
||||
fun equals2(a: Float?, b: Float?) = a!! == b!!
|
||||
|
||||
fun equals3(a: Float?, b: Float?) = a != null && b != null && a == b
|
||||
|
||||
fun equals4(a: Float?, b: Float?) = if (a is Float && b is Float) a == b else null!!
|
||||
|
||||
fun equals5(a: Any?, b: Any?) = if (a is Float && b is Float) a == b else null!!
|
||||
|
||||
|
||||
fun box(): String {
|
||||
if (-0.0F != 0.0F) return "fail 0"
|
||||
if (!equals1(-0.0F, 0.0F)) return "fail 1"
|
||||
if (!equals2(-0.0F, 0.0F)) return "fail 2"
|
||||
if (!equals3(-0.0F, 0.0F)) return "fail 3"
|
||||
if (!equals4(-0.0F, 0.0F)) return "fail 4"
|
||||
if (!equals5(-0.0F, 0.0F)) return "fail 5"
|
||||
|
||||
return "OK"
|
||||
}
|
||||
|
||||
@@ -0,0 +1,30 @@
|
||||
fun equals1(a: Double, b: Double?) = a == b
|
||||
|
||||
fun equals2(a: Double?, b: Double?) = a!! == b!!
|
||||
|
||||
fun equals3(a: Double?, b: Double?) = a != null && a == b
|
||||
|
||||
fun equals4(a: Double?, b: Double?) = if (a is Double) a == b else null!!
|
||||
|
||||
fun equals5(a: Any?, b: Any?) = if (a is Double && b is Double?) a == b else null!!
|
||||
|
||||
fun equals6(a: Any?, b: Any?) = if (a is Double? && b is Double) a == b else null!!
|
||||
|
||||
fun equals7(a: Double?, b: Double?) = a == b
|
||||
|
||||
fun equals8(a: Any?, b: Any?) = if (a is Double? && b is Double?) a == b else null!!
|
||||
|
||||
|
||||
fun box(): String {
|
||||
if (!equals1(-0.0, 0.0)) return "fail 1"
|
||||
if (!equals2(-0.0, 0.0)) return "fail 2"
|
||||
if (!equals3(-0.0, 0.0)) return "fail 3"
|
||||
if (!equals4(-0.0, 0.0)) return "fail 4"
|
||||
if (!equals5(-0.0, 0.0)) return "fail 5"
|
||||
if (!equals6(-0.0, 0.0)) return "fail 6"
|
||||
if (!equals7(-0.0, 0.0)) return "fail 7"
|
||||
if (!equals8(-0.0, 0.0)) return "fail 8"
|
||||
|
||||
return "OK"
|
||||
}
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
// IGNORE_BACKEND: JS
|
||||
fun less1(a: Double, b: Double) = a.compareTo(b) == -1
|
||||
|
||||
fun less2(a: Double?, b: Double?) = a!!.compareTo(b!!) == -1
|
||||
|
||||
fun less3(a: Double?, b: Double?) = a != null && b != null && a.compareTo(b) == -1
|
||||
|
||||
fun less4(a: Double?, b: Double?) = if (a is Double && b is Double) a.compareTo(b) == -1 else null!!
|
||||
|
||||
fun less5(a: Any?, b: Any?) = if (a is Double && b is Double) a.compareTo(b) == -1 else null!!
|
||||
|
||||
fun box(): String {
|
||||
if (!less1(-0.0, 0.0)) return "fail 1"
|
||||
if (!less2(-0.0, 0.0)) return "fail 2"
|
||||
if (!less3(-0.0, 0.0)) return "fail 3"
|
||||
if (!less4(-0.0, 0.0)) return "fail 4"
|
||||
if (!less5(-0.0, 0.0)) return "fail 5"
|
||||
|
||||
return "OK"
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
// IGNORE_BACKEND: JS
|
||||
|
||||
fun equals1(a: Double, b: Double) = a.equals(b)
|
||||
|
||||
fun equals2(a: Double?, b: Double?) = a!!.equals(b!!)
|
||||
|
||||
fun equals3(a: Double?, b: Double?) = a != null && b != null && a.equals(b)
|
||||
|
||||
fun equals4(a: Double?, b: Double?) = if (a is Double && b is Double) a.equals(b) else null!!
|
||||
|
||||
|
||||
fun box(): String {
|
||||
if ((-0.0).equals(0.0)) return "fail 0"
|
||||
if (equals1(-0.0, 0.0)) return "fail 1"
|
||||
if (equals2(-0.0, 0.0)) return "fail 2"
|
||||
if (equals3(-0.0, 0.0)) return "fail 3"
|
||||
if (equals4(-0.0, 0.0)) return "fail 4"
|
||||
|
||||
return "OK"
|
||||
}
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
// FILE: b.kt
|
||||
|
||||
class Foo<T>(val minus0: T, val plus0: T) {
|
||||
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
val foo = Foo<Double>(-0.0, 0.0)
|
||||
val fooF = Foo<Float>(-0.0F, 0.0F)
|
||||
|
||||
if (foo.minus0 < foo.plus0) return "fail 0"
|
||||
if (fooF.minus0 < fooF.plus0) return "fail 1"
|
||||
|
||||
if (foo.minus0 != foo.plus0) return "fail 3"
|
||||
if (fooF.minus0 != fooF.plus0) return "fail 4"
|
||||
|
||||
return "OK"
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
fun greater1(a: Double, b: Double) = a > b
|
||||
|
||||
fun greater2(a: Double?, b: Double?) = a!! > b!!
|
||||
|
||||
fun greater3(a: Double?, b: Double?) = a != null && b != null && a > b
|
||||
|
||||
fun greater4(a: Double?, b: Double?) = if (a is Double && b is Double) a > b else null!!
|
||||
|
||||
fun greater5(a: Any?, b: Any?) = if (a is Double && b is Double) a > b else null!!
|
||||
|
||||
fun box(): String {
|
||||
if (0.0 > -0.0) return "fail 0"
|
||||
if (greater1(0.0, -0.0)) return "fail 1"
|
||||
if (greater2(0.0, -0.0)) return "fail 2"
|
||||
if (greater3(0.0, -0.0)) return "fail 3"
|
||||
if (greater4(0.0, -0.0)) return "fail 4"
|
||||
if (greater5(0.0, -0.0)) return "fail 5"
|
||||
|
||||
return "OK"
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
fun greater1(a: Float, b: Float) = a > b
|
||||
|
||||
fun greater2(a: Float?, b: Float?) = a!! > b!!
|
||||
|
||||
fun greater3(a: Float?, b: Float?) = a != null && b != null && a > b
|
||||
|
||||
fun greater4(a: Float?, b: Float?) = if (a is Float && b is Float) a > b else null!!
|
||||
|
||||
fun greater5(a: Any?, b: Any?) = if (a is Float && b is Float) a > b else null!!
|
||||
|
||||
fun box(): String {
|
||||
if (0.0F > -0.0F) return "fail 0"
|
||||
if (greater1(0.0F, -0.0F)) return "fail 1"
|
||||
if (greater2(0.0F, -0.0F)) return "fail 2"
|
||||
if (greater3(0.0F, -0.0F)) return "fail 3"
|
||||
if (greater4(0.0F, -0.0F)) return "fail 4"
|
||||
if (greater5(0.0F, -0.0F)) return "fail 5"
|
||||
|
||||
return "OK"
|
||||
}
|
||||
+49
@@ -0,0 +1,49 @@
|
||||
// IGNORE_BACKEND: JS
|
||||
|
||||
inline fun less(a: Comparable<Double>, b: Double): Boolean {
|
||||
return a < b
|
||||
}
|
||||
|
||||
inline fun equals(a: Comparable<Double>, b: Comparable<Double>): Boolean {
|
||||
return a == b
|
||||
}
|
||||
|
||||
inline fun <T: Comparable<Double>> lessGeneric(a: T, b: Double): Boolean {
|
||||
return a < b
|
||||
}
|
||||
|
||||
inline fun <T: Comparable<Double>> equalsGeneric(a: T, b: Double): Boolean {
|
||||
return a == b
|
||||
}
|
||||
|
||||
inline fun <reified T: Comparable<Double>> lessReified(a: T, b: Double): Boolean {
|
||||
return a < b
|
||||
}
|
||||
|
||||
inline fun <reified T: Comparable<Double>> equalsReified(a: T, b: T): Boolean {
|
||||
return a == b
|
||||
}
|
||||
|
||||
inline fun less754(a: Double, b: Double): Boolean {
|
||||
return a < b
|
||||
}
|
||||
|
||||
inline fun equals754(a: Double, b: Double): Boolean {
|
||||
return a == b
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
if (!less(-0.0, 0.0)) return "fail 1"
|
||||
if (equals(-0.0, 0.0)) return "fail 2"
|
||||
|
||||
if (!lessGeneric(-0.0, 0.0)) return "fail 3"
|
||||
if (equalsGeneric(-0.0, 0.0)) return "fail 4"
|
||||
|
||||
if (!lessReified(-0.0, 0.0)) return "fail 5"
|
||||
if (equalsReified(-0.0, 0.0)) return "fail 6"
|
||||
|
||||
if (less754(-0.0, 0.0)) return "fail 7"
|
||||
if (!equals754(-0.0, 0.0)) return "fail 8"
|
||||
|
||||
return "OK"
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
fun less1(a: Double, b: Double) = a < b
|
||||
|
||||
fun less2(a: Double?, b: Double?) = a!! < b!!
|
||||
|
||||
fun less3(a: Double?, b: Double?) = a != null && b != null && a < b
|
||||
|
||||
fun less4(a: Double?, b: Double?) = if (a is Double && b is Double) a < b else null!!
|
||||
|
||||
fun less5(a: Any?, b: Any?) = if (a is Double && b is Double) a < b else null!!
|
||||
|
||||
fun box(): String {
|
||||
if (-0.0 < 0.0) return "fail 0"
|
||||
if (less1(-0.0, 0.0)) return "fail 1"
|
||||
if (less2(-0.0, 0.0)) return "fail 2"
|
||||
if (less3(-0.0, 0.0)) return "fail 3"
|
||||
if (less4(-0.0, 0.0)) return "fail 4"
|
||||
if (less5(-0.0, 0.0)) return "fail 5"
|
||||
|
||||
return "OK"
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
fun less1(a: Float, b: Float) = a < b
|
||||
|
||||
fun less2(a: Float?, b: Float?) = a!! < b!!
|
||||
|
||||
fun less3(a: Float?, b: Float?) = a != null && b != null && a < b
|
||||
|
||||
fun less4(a: Float?, b: Float?) = if (a is Float && b is Float) a < b else true
|
||||
|
||||
fun less5(a: Any?, b: Any?) = if (a is Float && b is Float) a < b else true
|
||||
|
||||
fun box(): String {
|
||||
if (-0.0F < 0.0F) return "fail 0"
|
||||
if (less1(-0.0F, 0.0F)) return "fail 1"
|
||||
if (less2(-0.0F, 0.0F)) return "fail 2"
|
||||
if (less3(-0.0F, 0.0F)) return "fail 3"
|
||||
if (less4(-0.0F, 0.0F)) return "fail 4"
|
||||
if (less5(-0.0F, 0.0F)) return "fail 5"
|
||||
|
||||
return "OK"
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
fun box(): String {
|
||||
val plusZero: Any? = 0.0
|
||||
val minusZero: Any? = -0.0
|
||||
if ((minusZero as Double) < (plusZero as Double)) return "fail 0"
|
||||
|
||||
val plusZeroF: Any? = 0.0F
|
||||
val minusZeroF: Any? = -0.0F
|
||||
if ((minusZeroF as Float) < (plusZeroF as Float)) return "fail 1"
|
||||
|
||||
if ((minusZero as Double) != (plusZero as Double)) return "fail 3"
|
||||
|
||||
if ((minusZeroF as Float) != (plusZeroF as Float)) return "fail 4"
|
||||
|
||||
return "OK"
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
// IGNORE_BACKEND: JS
|
||||
fun box(): String {
|
||||
val plusZero: Double? = 0.0
|
||||
val minusZero: Double = -0.0
|
||||
if (plusZero?.equals(minusZero) ?: null!!) {
|
||||
return "fail 1"
|
||||
}
|
||||
|
||||
if (plusZero?.compareTo(minusZero) ?: null!! != 1) {
|
||||
return "fail 2"
|
||||
}
|
||||
|
||||
return "OK"
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
// IGNORE_BACKEND: JS
|
||||
fun box(): String {
|
||||
val zero: Any = 0.0
|
||||
val floatZero: Any = -0.0F
|
||||
if (zero is Double && floatZero is Float) {
|
||||
if (zero == floatZero) return "fail 1"
|
||||
|
||||
if (zero <= floatZero) return "fail 2"
|
||||
|
||||
return "OK"
|
||||
}
|
||||
|
||||
return "fail"
|
||||
}
|
||||
+21
@@ -0,0 +1,21 @@
|
||||
fun box(): String {
|
||||
val plusZero: Any = 0.0
|
||||
val minusZero: Any = -0.0
|
||||
if (plusZero is Double) {
|
||||
when (plusZero) {
|
||||
-0.0 -> {
|
||||
}
|
||||
else -> return "fail 1"
|
||||
}
|
||||
|
||||
if (minusZero is Double) {
|
||||
when (plusZero) {
|
||||
minusZero -> {
|
||||
}
|
||||
else -> return "fail 2"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return "OK"
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
fun box(): String {
|
||||
val plusZero: Any = 0.0
|
||||
val minusZero: Any = -0.0
|
||||
if (plusZero is Double && minusZero is Double) {
|
||||
when {
|
||||
plusZero < minusZero -> {
|
||||
return "fail 1"
|
||||
}
|
||||
|
||||
plusZero > minusZero -> {
|
||||
return "fail 2"
|
||||
}
|
||||
else -> {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
when {
|
||||
plusZero == minusZero -> {
|
||||
}
|
||||
else -> return "fail 3"
|
||||
}
|
||||
}
|
||||
|
||||
return "OK"
|
||||
}
|
||||
Reference in New Issue
Block a user