Что эквивалентно isnan()
в Swift?
Мне нужно проверить, действительны ли некоторые результаты операции и удалить те недопустимые, как x/0
Благодаря
Каков Swift эквивалент isnan()?
Ответ 1
Он определен в протоколе FloatingPointNumber, который как Float, так и Double соответствуют. Используется следующее:
let d = 3.0
let isNan = d.isNaN // False
let d = Double.NaN
let isNan = d.isNaN // True
Если вы ищете способ сделать эту проверку самостоятельно, вы можете. IEEE определяет, что NaN!= NaN, то есть вы не можете напрямую сравнивать NaN с числом, чтобы определить его значение-число. Однако вы можете проверить, что maybeNaN != maybeNaN
. Если это условие оценивается как истинное, вы имеете дело с 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 перечислении.
Ответ 2
Принятый ответ работает, но когда я впервые увидел его, я не совсем понял из-за примера.
Вот пример от Apple для тех, кто не ясно:
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")
}