【Swift】Nan(Not a Number)とは?識別方法と意味!
この記事からわかること
- Swiftで浮動小数点数型(DoubleやFloat)の扱い
- Nan(Not a Number:非数)とは?
- Nanを識別する方法
- Double value cannot be converted to Int because it is either infinite or NaNエラーとは?
- infinityプロパティ:∞とは?
index
[open]
\ アプリをリリースしました /
環境
- Xcode:14.3.1
- iOS:16.4
- Swift:5.8.1
Nan(Not a Number)とは?
Nan(非数)とはNot a Numberの略称でプログラム言語で数値として表せない計算結果になった際などに利用される数値表現です。SwiftでもNanになる可能性があり、特定の計算を行った際などにnanという値が格納されることがあります。
SwiftではDoubleやFloatのタイププロパティとしても定義されており、計算せずとも参照することも可能です。
static var nan: Double { get }
static var nan: Float { get }
似たようなものにinfinityプロパティから∞を参照することも可能です。type(of:)でデータ型を調べると特別な型ではなくDoubleやFloatのままになっています。
Double.nan // nan
Float.nan // nan
type(of: Double.nan) // Double
type(of: Float.nan) // Float
Double.infinity // ∞
Float.infinity // ∞
計算でNanになる例
計算でNanになる例をみてみます。例えばDoubleの0.0同士を割り算するとnanになります。
let result = 0.0 / 0.0
print(result) // nan
Nanを識別する
計算の結果nanになってしまった場合、その数値を使って計算してもnanにしかならないのでisNaNプロパティを使用してnanであるかを識別して処理を分岐させる必要があります。
let result: Float = 0.0 / 0.0
// そのまま計算してもnanのまま
print(result * 12) // nan
if result.isNaN {
print("Result is NaN")
} else {
print("Result is not NaN")
}
Double value cannot be converted to Int because it is either infinite or NaN
nanになっただけではアプリはクラッシュしませんが、Int型などに型変換を試みるとDouble value cannot be converted to Int because it is either infinite or NaNというエラーが発生しアプリがクラッシュしてしまいます。
func test(a:Double, b:Double) -> Int {
let result = a / b
return Int(result)
// Double value cannot be converted to Int because it is either infinite or NaN
}
test(a: 0.0, b: 0.0)
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。







