在Fixnum ** Fixnum中输入类型

时间:2012-01-01 04:13:09

标签: ruby math exponent ruby-1.9.3

ruby-doc中,它表示<Fixnum> ** <Numeric>可能是小数,并举例说明:

2 ** -1 #=> 0.5
2 ** 0.5 #=> 1.4142135623731

但是就我的问题而言,它有时会给出一个Rational答案,就像下面的指数-1一样:

2 ** -1 #=> (1/2)
2 ** 0.5 #=> 1.4142135623731

看起来ruby-doc不准确,ruby尝试在可能时输入Rational,但我不完全确定。当基数和指数都是Fixnum时,这里的确切类型转换规则是什么?我对Ruby 1.9.3特别感兴趣,但不同版本之间的结果不同吗?

1 个答案:

答案 0 :(得分:1)

DGM是对的;答案在你链接的文档中是正确的,尽管它在C中。这是相关的一点;我添加了一些评论:

static VALUE
fix_pow(VALUE x, VALUE y)
{
    long a = FIX2LONG(x);

    if (FIXNUM_P(y)) {          // checks to see if Y is a Fixnum
        long b = FIX2LONG(y);

        if (b < 0)
            // if b is less than zero, convert x into a Rational
            // and call ** on it and 1 over y
            // (this is how you raise to a negative power).
            return rb_funcall(rb_rational_raw1(x), rb_intern("**"), 1, y);

现在我们可以转到docs for Rational并查看其中有关the ** operator的内容:

rat ** numeric → numeric
     

执行取幂。

     

例如:

Rational(2)    ** Rational(3)    #=> (8/1)
Rational(10)   ** -2             #=> (1/100)
Rational(10)   ** -2.0           #=> 0.01
Rational(-4)   ** Rational(1,2)  #=> (1.2246063538223773e-16+2.0i)
Rational(1, 2) ** 0              #=> (1/1)
Rational(1, 2) ** 0.0            #=> 1.0