Fix floating point conversions to match Kotlin/JVM

(cherry picked from commit de078d6)
This commit is contained in:
Pavel Punegov
2018-01-22 20:04:36 +03:00
committed by Pavel Punegov
parent df41389ef7
commit cc89dc2754
4 changed files with 80 additions and 12 deletions
+28 -8
View File
@@ -370,12 +370,22 @@ KFloat Kotlin_Float_dec (KFloat a ) { return --a; }
KFloat Kotlin_Float_unaryPlus (KFloat a ) { return +a; }
KFloat Kotlin_Float_unaryMinus (KFloat a ) { return -a; }
KByte Kotlin_Float_toByte (KFloat a ) { return a; }
KShort Kotlin_Float_toShort (KFloat a ) { return a; }
KInt Kotlin_Float_toInt (KFloat a ) { return a; }
KLong Kotlin_Float_toLong (KFloat a ) { return a; }
KInt Kotlin_Float_toInt (KFloat a ) {
if (isnan(a)) return 0;
if (a >= (KFloat) INT_MAX) return INT_MAX;
if (a <= (KFloat) INT_MIN) return INT_MIN;
return a;
}
KLong Kotlin_Float_toLong (KFloat a ) {
if (isnan(a)) return 0;
if (a >= (KFloat) LONG_MAX) return LONG_MAX;
if (a <= (KFloat) LONG_MIN) return LONG_MIN;
return a;
}
KFloat Kotlin_Float_toFloat (KFloat a ) { return a; }
KDouble Kotlin_Float_toDouble (KFloat a ) { return a; }
KByte Kotlin_Float_toByte (KFloat a ) { return (KByte) Kotlin_Float_toInt(a); }
KShort Kotlin_Float_toShort (KFloat a ) { return (KShort) Kotlin_Float_toInt(a); }
KInt Kotlin_Float_bits (KFloat a) {
union {
@@ -448,10 +458,20 @@ KDouble Kotlin_Double_dec (KDouble a ) { return --a; }
KDouble Kotlin_Double_unaryPlus (KDouble a ) { return +a; }
KDouble Kotlin_Double_unaryMinus (KDouble a ) { return -a; }
KByte Kotlin_Double_toByte (KDouble a ) { return a; }
KShort Kotlin_Double_toShort (KDouble a ) { return a; }
KInt Kotlin_Double_toInt (KDouble a ) { return a; }
KLong Kotlin_Double_toLong (KDouble a ) { return a; }
KInt Kotlin_Double_toInt (KDouble a ) {
if (isnan(a)) return 0;
if (a >= (KDouble) INT_MAX) return INT_MAX;
if (a <= (KDouble) INT_MIN) return INT_MIN;
return a;
}
KLong Kotlin_Double_toLong (KDouble a ) {
if (isnan(a)) return 0;
if (a >= (KDouble) LONG_MAX) return LONG_MAX;
if (a <= (KDouble) LONG_MIN) return LONG_MIN;
return a;
}
KByte Kotlin_Double_toByte (KDouble a ) { return (KByte) Kotlin_Double_toInt(a); }
KShort Kotlin_Double_toShort (KDouble a ) { return (KShort) Kotlin_Double_toInt(a); }
KFloat Kotlin_Double_toFloat (KDouble a ) { return a; }
KDouble Kotlin_Double_toDouble (KDouble a ) { return a; }
+2 -4
View File
@@ -975,8 +975,7 @@ public final class Float : Number(), Comparable<Float> {
/**
* A constant holding the "not a number" value of Float.
*/
@Suppress("DIVISION_BY_ZERO")
public val NaN: Float = 0.0f / 0.0f
public val NaN: Float = kotlinx.cinterop.bitsToFloat(0x7fc00000)
}
/**
@@ -1194,8 +1193,7 @@ public final class Double : Number(), Comparable<Double> {
/**
* A constant holding the "not a number" value of Double.
*/
@Suppress("DIVISION_BY_ZERO")
public val NaN: Double = 0.0 / 0.0
public val NaN: Double = kotlinx.cinterop.bitsToDouble(0x7ff8000000000000L)
}
/**