こんにちは
高野です。

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