【Swift】Nan(Not a Number)とは?識別方法と意味!

この記事からわかること

  • Swift浮動小数点数型(DoubleFloat)の扱い
  • Nan(Not a Number非数)とは?
  • Nanを識別する方法
  • Double value cannot be converted to Int because it is either infinite or NaNエラーとは?
  • infinityプロパティとは?

index

[open]

\ アプリをリリースしました /

みんなの誕生日

友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-

posted withアプリーチ

環境

Nan(Not a Number)とは?

公式リファレンス:nan

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になる例をみてみます。例えばDouble0.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)

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index