blob: f0823d83a16d3cdffb618b9ab7de49f9c3df6fcd [file]
// WITH_STDLIB
import kotlin.math.abs
private fun isPosZero(x: Double) = x == 0.0 && 1.0 / x == Double.POSITIVE_INFINITY
private fun isNegZero(x: Double) = x == 0.0 && 1.0 / x == Double.NEGATIVE_INFINITY
private fun isPosZeroF(x: Float) = x == 0.0f && 1.0f / x == Float.POSITIVE_INFINITY
private fun isNegZeroF(x: Float) = x == 0.0f && 1.0f / x == Float.NEGATIVE_INFINITY
private fun signOf(x: Double) = when {
x.isNaN() -> 0
x == 0.0 -> if (isNegZero(x)) -1 else 1
x > 0 -> 1
else -> -1
}
private fun signOf(x: Float) = when {
x.isNaN() -> 0
x == 0.0f -> if (isNegZeroF(x)) -1 else 1
x > 0f -> 1
else -> -1
}
fun box(): String {
run {
val r1 = 12 % 3.0
if (!(r1 == 0.0 && isPosZero(r1))) return "fail1"
val r2 = (-12) % 3.0
if (!(r2 == 0.0 && isNegZero(r2))) return "fail2"
val r3 = 12 % 3.0f
if (!(r3 == 0.0f && isPosZeroF(r3))) return "fail3"
val r4 = (-12) % 3.0f
if (!(r4 == 0.0f && isNegZeroF(r4))) return "fail4"
}
fun checkD(a: Int, b: Double): String? {
val r = a % b
if (r.isNaN()) return "fail5"
if (r == 0.0 || isPosZero(r) || isNegZero(r)) return "fail6"
if (signOf(r) != signOf(a.toDouble())) return "fail7"
if (!(abs(r) < abs(b))) return "fail8"
return null
}
listOf(
Int.MAX_VALUE to 3.0, Int.MAX_VALUE to -3.0,
Int.MIN_VALUE to 3.0, Int.MIN_VALUE to -3.0
).forEach { (a,b) -> checkD(a,b)?.let { return it } }
fun checkF(a: Int, b: Float): String? {
val r = a % b
if (r.isNaN()) return "fail9"
if (r == 0.0f || isPosZeroF(r) || isNegZeroF(r)) return "fail10"
if (signOf(r) != signOf(a.toFloat())) return "fail11"
if (!(abs(r) < abs(b))) return "fail12"
return null
}
listOf(
Int.MAX_VALUE to 3.0f, Int.MAX_VALUE to -3.0f,
Int.MIN_VALUE to 3.0f, Int.MIN_VALUE to -3.0f
).forEach { (a,b) -> checkF(a,b)?.let { return it } }
return "OK"
}