web-dev-qa-db-ja.com

isnan()と同等のSwift?

これはisnan() in Swift?に相当するものですか?

54
Alberto Bellini

FloatingPointNumber プロトコルで定義されており、 FloatDouble の両方のタイプが準拠しています。使用法は次のとおりです。

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

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

このチェックを自分で行う方法を探しているなら、できます。 IEEEでは、NaN!= NaNと定義しています。つまり、NaNを数値と直接比較して、そのis-a-number-nessを決定することはできません。ただし、maybeNaN != maybeNaN。この条件がtrueと評価される場合、NaNを扱っています。

ただし、aVariable.isNaNは、値がNaNかどうかを判別します。


ちょっとした注意点として、使用している値の分類について確信が持てない場合は、FloatingPointNumber準拠型の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)
}

その値は FloatingPointClassification enumで宣言されています。

112
Mick MacCallum

受け入れられた答えは機能しますが、最初にそれを見たとき、例のために明確ではなく、NaNが"not a number"

以下は、Appleが明確でない人のための例です:

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