Math.sqrt(n).to_i が正しい値をかえすのはnがどれくらいまででしょうか？


Ruby 2.2.1 を使っているのですが、  
n = 1, 2, … , のとき  
Math.sqrt(n).to_i が正しい値をかえす  
（すなわち、1 からn までの全てのm に対して、Math.sqrt(m).to_i の値が [√m] となる）  
のはn がどれくらいまででしょうか？

ちなみに  
n = 4503599761588224 のとき、  
Math.sqrt(n).to_i が正しい値をかえさないことを  
次のコードを実行して見つけました。

[code]

    require 'bigdecimal/math'
    include BigMath
    
    67000000.upto(68000000){|i|
      n = i * i - 1
      if !((BigDecimal.new(n.to_s).sqrt(10)).to_i == Math.sqrt(n).to_i)
        p [n, i, (BigDecimal.new(n.to_s).sqrt(10)).to_i, Math.sqrt(n).to_i]
        break
      end
    }
    
[/code]

（追記）  
n = i * i - 1型を全て調べるなら、次のコードの方がよい。

[code]

    i = 2
    num = Math.sqrt(i * i - 1).to_i
    while num == i - 1
      i += 1
      num = Math.sqrt(i * i - 1).to_i
    end
    p [i * i - 1, i]
    
[/code]

出力結果  
[4503599761588224, 67108865]




以前誤差を検討したことがあります。(n+ε)^2 = n^2 + 2nε + ε^2 ですから、(2nε +
ε^2)部分がn^2部分に比べ浮動小数点数の有効数字に収まらなくなると、sqrtを取った結果がnになってしまいます。

IEEE倍精度浮動小数点数を仮定した場合、正しい整数値が得られる最大の数は次の数、となりました。

[code]

    (2^26-1)^2 = 4503599493152769
    
[/code]

参照: <http://blog.practical-scheme.net/gauche/20130319-inexact-sqrt>

(ただし、Rubyのto_iの仕様を正確に把握していないので、もしかすると違う評価方法を使う必要があるかもしれません。)

追記:
問題の条件を勘違いしていたかもしれません。上の数字は、「IEEE浮動小数点数でsqrtを取った場合、本来平方数でないのに結果が整数になってしまう、ということが起きない範囲での最大の平方数」です。

もし、ある平方数n^2に対して(1)それを浮動小数点数に変換し(2)sqrtを取り(3)整数丸めしたものがnになる、ような最大のnを求める問題でしたら、誤差が上手い具合に打ち消しあってより大きな数があり得るかもしれません。後ほど計算して追記します。

