こんにちは 高野です。 IA-64のメンテをしているのですが、BigDecimal#sqrtのテストでFailしており、 その原因がよくわかりません。 識者の方のご意見がいただければと思い、メールさせていただきます。 テストのコードは ---- x = BigDecimal.new((2**100).to_s) assert_equal(1125899906842624, x.sqrt(1)) assert_equal(1125899906842624, x.sqrt(2)) assert_equal(1125899906842624, x.sqrt(3)) # I don't understand the meaning of argument... ---- という部分で、実行時のログは以下の通りです。 http://www.atdot.net/sp/readonly/1coz7k_takano32 ---- 5) Failure: test_sqrt_bigdecimal(TestBigDecimal) [/home/takano/ruby/test/bigdecimal/test_bigdecimal.rb:469]: Expected 1125899906842624, not #<BigDecimal:60000000061650b0,'0.1125899906 8426239999 9999999999 999975E16',45(54)>. ---- 引数の値が異なるのに同じ値と比較しているのがいけないのかな?と考え、 他のプラットフォームでも以下のようなコードで実行してみました。 ---- require 'bigdecimal' puts BigDecimal.new( (2**100).to_s ).sqrt(1) puts BigDecimal.new( (2**100).to_s ).sqrt(2) puts BigDecimal.new( (2**100).to_s ).sqrt(3) ---- まずはわれらが(?)IA-64です。 ruby 1.9.0 (2008-09-30 revision 19570) [ia64-linux] ---- 0.112589990684262399999999999999999975E16 0.112589990684262399999999999999999975E16 0.112589990684262399999999999999999975E16 ---- 次に x64 です。 ruby 1.8.6 (2007-09-24 patchlevel 111) [x86_64-linux] ---- 0.112589990684262399999999999999999975E16 0.112589990684262399999999999999999975E16 0.112589990684262399999999999999999975E16 ---- 最後に IA-32 です。 ruby 1.8.7 (2008-08-11 patchlevel 72) [i686-linux] ---- 0.1125899906842624E16 0.1125899906842624E16 0.1125899906842624E16 ---- いずれも異なる値が帰っているのですが、 revision 19633 http://www.rubyist.net/~akr/chkbuild/debian-sarge/ruby-trunk/log/20080930T132601.txt.gz では単純にFixnumとの比較でパスしているようです。 # IA-64では精度があがったので、比較する桁数が多くなっている? 自分はあまりここらへんのことに詳しくないので、識者の方のご意見が伺えればと 思い、連絡させていただきました。 # ちょっとおっくうで、IA-64以外のtrunkの環境を作っていないのが申し訳ない # ところなのですが、深みに入るようでしたら、環境を作っておこうと思います。 何かお分かりの方がいらっしゃいましたら、よろしくお願いします。 -- TAKANO Mitsuhiro