Bug #5266

BigDecimal#sqrt で、大きな数の平方根の、要求する精度が低いある範囲のとき、結果がおかしい

Added by Makoto Kishimoto over 3 years ago. Updated over 1 year ago.

[ruby-dev:44450]
Status:Closed
Priority:Normal
Assignee:Kenta Murata
ruby -v:ruby 1.9.4dev (2011-07-18 trunk 32577) [x86_64-freebsd8.2] Backport:

Description

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 桁の間に境界があり、
また異常のある結果の精度も倍程度になります。

Associated revisions

Revision 43764
Added by Kenta Murata over 1 year ago

  • ext/bigdecimal/bigdecimal.c (BigDecimal_sqrt): Fix the precision of
    the result BigDecimal of sqrt.
    [Bug #5266]

  • test/bigdecimal/test_bigdecimal.rb: add tests for the above changes.

Revision 43764
Added by Kenta Murata over 1 year ago

  • ext/bigdecimal/bigdecimal.c (BigDecimal_sqrt): Fix the precision of
    the result BigDecimal of sqrt.
    [Bug #5266]

  • test/bigdecimal/test_bigdecimal.rb: add tests for the above changes.

History

#1 Updated by Kenta Murata over 3 years ago

  • Assignee set to Kenta Murata

#2 Updated by Shyouhei Urabe about 3 years ago

  • Status changed from Open to Assigned

#3 Updated by Yusuke Endoh over 2 years ago

  • Target version changed from 2.0.0 to 2.1.0

#4 Updated by Kenta Murata over 1 year ago

  • Status changed from Assigned to Closed
  • % Done changed from 0 to 100

This issue was solved with changeset r43764.
Makoto, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.


  • ext/bigdecimal/bigdecimal.c (BigDecimal_sqrt): Fix the precision of
    the result BigDecimal of sqrt.
    [Bug #5266]

  • test/bigdecimal/test_bigdecimal.rb: add tests for the above changes.

Also available in: Atom PDF