Double.isNaN în Kotlin

Verifică dacă un Double este NaN („nu este număr”), rezultatul unor calcule ca 0.0 / 0.0 sau sqrt(-1.0).

Sintaxă
fun Double.isNaN(): Boolean
fun Double.isInfinite(): Boolean
fun Double.isFinite(): Boolean

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ște x.isNaN().
  • Te aștepți ca 1.0 / 0.0 să arunce excepție, ca la întregi. Pentru Double rezultatul este Infinity.

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.