From: Kenta Murata Date: 2011-09-02T14:44:50+09:00 Subject: [ruby-dev:44451] [Ruby 1.9 - Bug #5266] BigDecimal#sqrt で、大きな数の平方根の、要求する精度が低いある範囲のとき、結果がおかしい Issue #5266 has been updated by Kenta Murata. Assignee set to Kenta Murata ---------------------------------------- Bug #5266: BigDecimal#sqrt で、大きな数の平方根の、要求する精度が低いある範囲のとき、結果がおかしい http://redmine.ruby-lang.org/issues/5266 Author: Makoto Kishimoto Status: Open Priority: Normal Assignee: Kenta Murata Category: ext Target version: 1.9.x ruby -v: ruby 1.9.4dev (2011-07-18 trunk 32577) [x86_64-freebsd8.2] BigDecimal#sqrt で、大きい数(10**n でだいたい n > 100 あたり から顕著)の平方根を求める時、sqrt の引数(桁数で要求する、精度の下限) がだいたい 20 ~ 0.55 * n の時、期待するような結果が出ません。 以下具体例を示して説明します。 $ irb19 irb(main):001:0> RUBY_DESCRIPTION => "ruby 1.9.4dev (2011-07-18 trunk 32577) [x86_64-freebsd8.2]" irb(main):002:0> require "bigdecimal" => true irb(main):003:0> BigDecimal("2" + "0" * 100).sqrt(55) => # irb(main):004:0> BigDecimal("2" + "0" * 100).sqrt(56) => # 101 桁の数の平方根で、55 桁の精度を要求しても、36 桁の結果しか 帰って来ず、56 桁の結果の値と比較するとわかりますが、20桁程度の精度しか ありません。 irb(main):005:0> BigDecimal("2" + "0" * 200).sqrt(109) => # irb(main):006:0> BigDecimal("2" + "0" * 200).sqrt(110) => # 201 桁の数だと、要求する精度が 109 桁と 110 桁の間に境界があり、 また異常のある結果の精度も倍程度になります。 -- http://redmine.ruby-lang.org