高野です。

メーリングリストに乱投すみません。

require 'bigdecimal'
p BigDecimal.new( (2**100).to_s ).sqrt(1) ==
1125899906842623.99999999999999999975
p BigDecimal.new( (2**100).to_s ).sqrt(2) ==
1125899906842623.99999999999999999975
p BigDecimal.new( (2**100).to_s ).sqrt(3) ==
1125899906842623.99999999999999999975

で
true
true
true

となりました。 @ IA-64

精度があがったため、もとのFixnumでは一致しなかったようです。
とりあえず、テストのFixnumをFloatにして精度をあげる必要があるようですが、
他のアーキテクチャでこのコードを動かすとfalseになってりしてよくわかりま
せん。 orz




TAKANO Mitsuhiro さんは書きました:
> こんにちは
> 高野です。
>
> 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の環境を作っていないのが申し訳ない
> # ところなのですが、深みに入るようでしたら、環境を作っておこうと思います。
>
> 何かお分かりの方がいらっしゃいましたら、よろしくお願いします。
>
>