質問: Math.sqrt(i * i - 1).to_i end p [i * i - 1, i] ``` 出力結果 [4503599761588224, 67108865]
回答: 以前誤差を検討したことがあります。(n+ε)^2 = n^2 + 2nε + ε^2 ですから、(2nε + ε^2)部分がn^2部分に比べ浮動小数点数の有効数字に収まらなくなると、sqrtを取った結果がnになってしまいます。 IEEE倍精度浮動小数点数を仮定した場合、正しい整数値が得られる最大の数は次の数、となりました。 ``` (2^26-1)^2 = 4503599493152769 ``` 参照: (ただし、Rubyのto_iの仕様を正確に把握していないので、もしかすると違う評価方法を使う必要があるかもしれません。) 追記: 問題の条件を勘違いしていたかもしれません。上の数字は、「IEEE浮動小数点数でsqrtを取った場合、本来平方数でないのに結果が整数になってしまう、ということが起きない範囲での最大の平方数」です。 もし、ある平方数n^2に対して(1)それを浮動小数点数に変換し(2)sqrtを取り(3)整数丸めしたものがnになる、ような最大のnを求める問題でしたら、誤差が上手い具合に打ち消しあってより大きな数があり得るかもしれません。後ほど計算して追記します。