Float.greatestFiniteMagnitudeがよくわからない
そういえば、前の記事で、Swiftにおいて、Intの型が範囲を超えた場合の挙動について記述した。
具体的には、以下のコードで実験して見た。
var maxInt:Int = Int.max
var minInt:Int = Int.min
//変数に最大値以上を代入するとどうなるか
var maxPlusOne = maxInt + 1 //エラー
var minPlusOne = minInt - 1 //エラー
では、FloatやDoubleにおいて、実験して見た。
var maxMagnitudeFloat:Float = Float.greatestFiniteMagnitude
var maxMagnitudeDouble:Double = Double.greatestFiniteMagnitude
//変数に最大値以上を代入するとどうなるか
var maxMagnitudeFloatPlusOne:Float = maxMagnitudeFloat + 100//なんか行けた
var maxMagnitudeDoublePlusOne:Double = maxMagnitudeDouble + 100 //なんか行けた
具体的にいうと、3.402823e+38と1.797693134862316e+308の値になった。
じゃあ、100足したやつと、100足してないやつを比較してみよう
var maxMagnitudeFloat:Float = Float.greatestFiniteMagnitude
var maxMagnitudeDouble:Double = Double.greatestFiniteMagnitude
var maxMagnitudeFloatPlusOne:Float = maxMagnitudeFloat + 100//なんか行けた
var maxMagnitudeDoublePlusOne:Double = maxMagnitudeDouble + 100 //なんか行けた
if maxMagnitudeFloatPlusOne == maxMagnitudeFloat {
print("hoge")
}
if maxMagnitudeDoublePlusOne == maxMagnitudeDouble{
print("hoge")
}
hoge
hoge
と出力されてしまった。
多分、数字自体が大きくなりすぎて、100なんてものの数にもならなくなってしまったのかもしれない。
では、2倍してみようか
var maxMagnitudeFloat:Float = Float.greatestFiniteMagnitude
var maxMagnitudeDouble:Double = Double.greatestFiniteMagnitude
var maxMagnitudeFloatPlusOne:Float = maxMagnitudeFloat*2//ここだけ変えた
var maxMagnitudeDoublePlusOne:Double = maxMagnitudeDouble*2 //ここだけ変えた
if maxMagnitudeFloatPlusOne == maxMagnitudeFloat {
print("hoge")
}
if maxMagnitudeDoublePlusOne == maxMagnitudeDouble{
print("hoge")
}
今度は、infになって、同じではなくなった。(hoge hogeとは表示されない)エラーは返されない。
ということで、FloatとDoubleは最大値を超えた時の挙動が違うということである