【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]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
環境
- 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)
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。