LoginSignup
2
3

More than 5 years have passed since last update.

Float.greatestFiniteMagnitudeについて

Posted at

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は最大値を超えた時の挙動が違うということである

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3