From: TAKANO Mitsuhiro Date: 2008-10-04T14:41:21+09:00 Subject: [ruby-dev:36662] Re: [IA-64]BigDecimal#sqrt の仕様 たかのです。 Yukihiro Matsumoto さんは書きました: > まつもと ゆきひろです > > In message "Re: [ruby-dev:36634] Re: [IA-64]BigDecimal#sqrt の仕様" > on Tue, 30 Sep 2008 16:49:47 +0900, TAKANO Mitsuhiro writes: > > |つまり、sqrtの引数をでっかくすると戻りのBigDecimalの有効数字が大きくなり、 > |precsの二番目の要素の値も大きくなるようです。 > | > |なんだか薀蓄っぽくなってきたので、とりあえずパッチを送ります。 > > コミット権はまださしあげていませんでしたっけ。 > 取り込んでおきます。 > > すみません。 MacBook(x86_64)環境で動かしてみたらFailしてしまいました・・・orz (たまたまうまく動いてしまう環境もあるのかしら。) 精度の小さいところの差を取ったものと精度の大きいところの差を取って比較し たほうが 確実と考え、以下のように書き換えました。たびたびすみません。 # なんだか不安なので、識者の方でどなたかBigDecimalにお詳しいかたがいらっ しゃったら # ぜひご指摘お願いします。 Index: test/bigdecimal/test_bigdecimal.rb =================================================================== --- test/bigdecimal/test_bigdecimal.rb (revision 19669) +++ test/bigdecimal/test_bigdecimal.rb (working copy) @@ -466,9 +466,7 @@ x = BigDecimal.new("0.09") assert_in_delta(0.3, x.sqrt(1), 0.001) x = BigDecimal.new((2**100).to_s) - assert_equal(1125899906842624, x.sqrt(100)) - assert_equal(1125899906842624, x.sqrt(200)) - assert_equal(1125899906842624, x.sqrt(300)) # I don't understand the meaning of argument... + assert_equal(true, x.sqrt(100) - x.sqrt(200) > x.sqrt(300) - x.sqrt(400)) x = BigDecimal.new("-" + (2**100).to_s) assert_raise(FloatDomainError) { x.sqrt(1) } x = BigDecimal.new((2**200).to_s)