web-dev-qa-db-fra.com

Quel est l'équivalent Swift de isnan ()?

Quel est l'équivalent de isnan() in Swift? Je dois vérifier si certains résultats d'opération sont valides et supprimer ceux invalides comme x/0 Merci

54
Alberto Bellini

Il est défini dans le protocole FloatingPointNumber , auquel les types Float et Double sont conformes. L'utilisation est la suivante:

let d = 3.0
let isNan = d.isNaN // False

let d = Double.NaN
let isNan = d.isNaN // True

Si vous cherchez un moyen de faire ce contrôle vous-même, vous pouvez. IEEE définit que NaN! = NaN, ce qui signifie que vous ne pouvez pas comparer directement NaN à un nombre pour déterminer son is-a-number-ness. Cependant, vous pouvez vérifier que maybeNaN != maybeNaN. Si cette condition est évaluée comme vraie, vous avez affaire à NaN.

Bien que vous devriez préférer utiliser aVariable.isNaN pour déterminer si une valeur est NaN.


En guise de remarque, si vous n'êtes pas sûr de la classification de la valeur avec laquelle vous travaillez, vous pouvez basculer sur la valeur de votre propriété FloatingPointNumber du type conforme floatingPointClass.

let noClueWhatThisIs: Double = // ...

switch noClueWhatThisIs.floatingPointClass {
case .SignalingNaN:
    print(FloatingPointClassification.SignalingNaN)
case .QuietNaN:
    print(FloatingPointClassification.QuietNaN)
case .NegativeInfinity:
    print(FloatingPointClassification.NegativeInfinity)
case .NegativeNormal:
    print(FloatingPointClassification.NegativeNormal)
case .NegativeSubnormal:
    print(FloatingPointClassification.NegativeSubnormal)
case .NegativeZero:
    print(FloatingPointClassification.NegativeZero)
case .PositiveZero:
    print(FloatingPointClassification.PositiveZero)
case .PositiveSubnormal:
    print(FloatingPointClassification.PositiveSubnormal)
case .PositiveNormal:
    print(FloatingPointClassification.PositiveNormal)
case .PositiveInfinity:
    print(FloatingPointClassification.PositiveInfinity)
}

Ses valeurs sont déclarées dans l'énumération FloatingPointClassification .

112
Mick MacCallum

La réponse acceptée fonctionne mais quand je l'ai vue pour la première fois, je n'étais pas exactement clair à cause de l'exemple et je ne savais pas que NaN est un acronyme pour "not a number".

Voici un exemple de Apple pour toute personne qui n'est pas claire:

enter image description here

let x = 0.0
let y = x * .infinity // y is a NaN

if y.isNan {

    print("this is NaN") // this will print
} else {

    print("this isn't Nan")
}
0
Lance Samaria