Issue #5266 has been reported by Makoto Kishimoto. ---------------------------------------- Bug #5266: BigDecimal#sqrt で、大きな数の平方根の、要求する精度が低いある範囲のとき、結果がおかしい http://redmine.ruby-lang.org/issues/5266 Author: Makoto Kishimoto Status: Open Priority: Normal Assignee: 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) => #<BigDecimal:801370a88,'0.1414213562 3730925960 0758552551 27E51',36(81)> irb(main):004:0> BigDecimal("2" + "0" * 100).sqrt(56) => #<BigDecimal:8013720b8,'0.1414213562 3730950488 0168872420 9698078569 6718753769 4807317668 1337583355E51',81(90)> 101 桁の数の平方根で、55 桁の精度を要求しても、36 桁の結果しか 帰って来ず、56 桁の結果の値と比較するとわかりますが、20桁程度の精度しか ありません。 irb(main):005:0> BigDecimal("2" + "0" * 200).sqrt(109) => #<BigDecimal:80137ba00,'0.1414213562 3730950488 0168872420 9698078570 3148413402 613295E101',63(135)> irb(main):006:0> BigDecimal("2" + "0" * 200).sqrt(110) => #<BigDecimal:80137d0a8,'0.1414213562 3730950488 0168872420 9698078569 6718753769 4807317667 9737990732 4784621071 8501120828 2516704398 7185098437 5959938108 258992945E101',144(144)> 201 桁の数だと、要求する精度が 109 桁と 110 桁の間に境界があり、 また異常のある結果の精度も倍程度になります。
on 2011-09-02 05:05
on 2011-09-02 07:46
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) => #<BigDecimal:801370a88,'0.1414213562 3730925960 0758552551 27E51',36(81)> irb(main):004:0> BigDecimal("2" + "0" * 100).sqrt(56) => #<BigDecimal:8013720b8,'0.1414213562 3730950488 0168872420 9698078569 6718753769 4807317668 1337583355E51',81(90)> 101 桁の数の平方根で、55 桁の精度を要求しても、36 桁の結果しか 帰って来ず、56 桁の結果の値と比較するとわかりますが、20桁程度の精度しか ありません。 irb(main):005:0> BigDecimal("2" + "0" * 200).sqrt(109) => #<BigDecimal:80137ba00,'0.1414213562 3730950488 0168872420 9698078570 3148413402 613295E101',63(135)> irb(main):006:0> BigDecimal("2" + "0" * 200).sqrt(110) => #<BigDecimal:80137d0a8,'0.1414213562 3730950488 0168872420 9698078569 6718753769 4807317667 9737990732 4784621071 8501120828 2516704398 7185098437 5959938108 258992945E101',144(144)> 201 桁の数だと、要求する精度が 109 桁と 110 桁の間に境界があり、 また異常のある結果の精度も倍程度になります。
on 2013-02-18 13:23
Issue #5266 has been updated by mame (Yusuke Endoh). Target version changed from 2.0.0 to 2.1.0 ---------------------------------------- Bug #5266: BigDecimal#sqrt で、大きな数の平方根の、要求する精度が低いある範囲のとき、結果がおかしい https://bugs.ruby-lang.org/issues/5266#change-36508 Author: metanest (Makoto Kishimoto) Status: Assigned Priority: Normal Assignee: mrkn (Kenta Murata) Category: ext Target version: 2.1.0 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) => #<BigDecimal:801370a88,'0.1414213562 3730925960 0758552551 27E51',36(81)> irb(main):004:0> BigDecimal("2" + "0" * 100).sqrt(56) => #<BigDecimal:8013720b8,'0.1414213562 3730950488 0168872420 9698078569 6718753769 4807317668 1337583355E51',81(90)> 101 桁の数の平方根で、55 桁の精度を要求しても、36 桁の結果しか 帰って来ず、56 桁の結果の値と比較するとわかりますが、20桁程度の精度しか ありません。 irb(main):005:0> BigDecimal("2" + "0" * 200).sqrt(109) => #<BigDecimal:80137ba00,'0.1414213562 3730950488 0168872420 9698078570 3148413402 613295E101',63(135)> irb(main):006:0> BigDecimal("2" + "0" * 200).sqrt(110) => #<BigDecimal:80137d0a8,'0.1414213562 3730950488 0168872420 9698078569 6718753769 4807317667 9737990732 4784621071 8501120828 2516704398 7185098437 5959938108 258992945E101',144(144)> 201 桁の数だと、要求する精度が 109 桁と 110 桁の間に境界があり、 また異常のある結果の精度も倍程度になります。
Please log in before posting. Registration is free and takes only a minute.
Existing account
(Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
Log in with Google account | Log in with Yahoo account
No account? Register here.