0

少数の平方根を取得するが、非常に高いレベルの精度を指定すると、BigDecimalで何か奇妙なことが起こっています...

私が奇妙と言うとき、私は36の平方根が5であることを意味します。

誰かがここで何が起こっているのか説明できますか、これはバグですか...

require 'bigdecimal'
require 'bigdecimal/util'

@d = BigDecimal.new(36)
puts @d.sqrt(250).to_i

$ ruby1.9 test.rb 
5

$ ruby1.9 -v
ruby 1.9.3p0 (2011-10-30 revision 33570) [x86_64-darwin10]

$ uname -a
Darwin jack.bidcactus.local 10.8.0 Darwin Kernel Version 10.8.0: Tue Jun  7 16:33:36 PDT 2011; 
4

3 に答える 3

3

36の平方根は6です。Rubyがこの精度で評価すると、5.9999になります...を呼び出すとto_i、値が切り捨てられ、代わりに5になります。

于 2012-07-19T17:32:52.307 に答える
2

フロートを返します。これが、「奇妙な」動作が見られる理由です。したがって、これはバグではありません。API

コード:

           static VALUE
math_sqrt(VALUE obj, VALUE x)
{
    double d0, d;

    Need_Float(x);
    d0 = RFLOAT_VALUE(x);
    /* check for domain error */
    if (d0 < 0.0) domain_error("sqrt");
    if (d0 == 0.0) return DBL2NUM(0.0);
    d = sqrt(d0);
    return DBL2NUM(d);
}
于 2012-07-19T17:26:49.300 に答える
0

を呼び出すとto_i、平方根によって作成されたすべての小数精度が削除されます。を呼び出すと、 (私の削除を参照)の後のsのto_iほぼ無限の軌跡。それを行いたい場合は、を呼び出す前に呼び出すことをお勧めします。95to_iroundto_i

于 2012-07-19T17:29:39.767 に答える