Ce face Double.isNaN
NaN (Not a Number) este o valoare specială a tipului Double, care apare din calcule fără sens, de exemplu 0.0 / 0.0 sau sqrt(-1.0). O poți scrie și direct: Double.NaN. Orice calcul cu NaN dă tot NaN, deci o singură valoare greșită poate „strica” o medie întreagă.
NaN are o proprietate ciudată: nu este egal cu nimic, nici cu el însuși, deci x == Double.NaN este mereu false. Singura verificare corectă este x.isNaN(). Împărțirea unui număr nenul la 0.0 dă infinit (Infinity), pe care îl verifici cu isInfinite(); isFinite() este adevărat pentru numerele obișnuite.
Ce returnează
Boolean.
Exemple
Exemplul 1: De unde vine NaN
Împărțim prin funcția imparte, pentru că o împărțire la zero scrisă direct în cod (0.0 / 0.0) produce un avertisment de compilare. Compararea cu == nu funcționează; doar isNaN() dă răspunsul corect.
import kotlin.math.sqrt
fun imparte(a: Double, b: Double) = a / b
fun main() {
val x = imparte(0.0, 0.0)
println(x)
println(sqrt(-4.0))
println(x == Double.NaN)
println(x.isNaN())
}
Rezultat
NaN
NaN
false
true
Exemplul 2: NaN și infinit
Împărțirea la zero a unui număr nenul dă infinit, nu NaN.
fun imparte(a: Double, b: Double) = a / b
fun main() {
for (x in listOf(imparte(5.0, 0.0), imparte(-1.0, 0.0), imparte(0.0, 0.0), 3.14)) {
println("$x: NaN=${x.isNaN()}, infinit=${x.isInfinite()}, finit=${x.isFinite()}")
}
}
Rezultat
Infinity: NaN=false, infinit=true, finit=false
-Infinity: NaN=false, infinit=true, finit=false
NaN: NaN=true, infinit=false, finit=false
3.14: NaN=false, infinit=false, finit=true
Exemplul 3: Ignorarea valorilor invalide dintr-o medie
O singură valoare NaN face toată media NaN. Filtrăm valorile invalide înainte.
import kotlin.math.sqrt
fun main() {
val masuratori = listOf(4.0, 9.0, -1.0, 16.0).map { sqrt(it) }
println(masuratori)
println("Media cu NaN: ${masuratori.average()}")
println("Media valorilor valide: ${masuratori.filter { !it.isNaN() }.average()}")
}
Rezultat
[2.0, 3.0, NaN, 4.0]
Media cu NaN: NaN
Media valorilor valide: 3.0
Greșeli frecvente
- Scrii
if (x == Double.NaN). Condiția este mereu falsă; foloseștex.isNaN(). - Te aștepți ca
1.0 / 0.0să arunce excepție, ca la întregi. PentruDoublerezultatul esteInfinity.
Comenzi înrudite
sqrt: sqrt calculează rădăcina pătrată, pow ridică la putere (2.0.pow(3) = 8.0), hypot dă ipotenuza.Int.MAX_VALUE: Cea mai mare valoare pe care o poate ține un Int (2147483647); MIN_VALUE este cea mai mică.String.toDouble: Transformă un text într-un număr cu zecimale (Double); toDoubleOrNull returnează null dacă textul nu e număr.