Тип кастинга в Fixnum ** Fixnum - PullRequest
       41

Тип кастинга в Fixnum ** Fixnum

1 голос
/ 01 января 2012

В ruby-doc он говорит, что <Fixnum> ** <Numeric> может быть дробным, и приводит примеры:

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

, но на моем IRB иногда он дает Rationalответ как с показателем степени -1 ниже:

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

Похоже, что ruby-doc не точен, и ruby ​​пытается набрать приведение к Rational, когда это возможно, но я не совсем уверен.Каково точное правило приведения типов здесь, когда база и экспонента равны Fixnum?Меня особенно интересует Ruby 1.9.3, но отличается ли результат в разных версиях?

1 Ответ

1 голос
/ 01 января 2012

ДГМ прав; ответ верен в документах, которые вы связали, хотя он написан на 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);

Теперь мы можем перейти к документам для Rational и проверить, что там говорится о операторе ** :

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
...