AS3の謎(ただのループなのにスタックオーバーフロー)

下のコードを実行すると、スタックオーバーフローが発生する。謎。

package {
  import flash.display.*;
  public class Test extends Sprite {
    private var t:Number;
    public function Test(){
      var N:int = 100000000;
      log(N);
      var d:Date = new Date();
      for(var j:int=0; j < 5; j++){
        var a:Number = 0.1;
        var b:Number = 0.1;
        var diff:Number;

        getTime();
        for(var i:int=0; i < N; i++){
          diff = a - b;
          diff * diff;
        }
        log(getDiff());
      }
    }
    
    public function getTime():Number{
      t = new Date().time;
      return t;
    }

    public function getDiff():Number{
      var t2:Number = new Date().time;
      var result:Number = t2 - t;
      t = t2;
      return result;
    }
  }
}

さらに謎なのは、下のように書き換えるとスタックオーバーフローせずに実行されるようになること。

for(var i:int=0; i < N; i++){
  diff = a - b;
  try{
    diff * diff;
  }catch(e){
    throw e;
  }
}