2012-01-01 2 views
1

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

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

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

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

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

+0

в документации вы связаны между собой, вы можете прочитать источник и увидеть ... – DGM

+0

самостоятельно, вы ли вы смотрите на источник? –

+0

Я не привык к части С Руби. – sawa

ответ

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 
+0

Спасибо. Я не привык к C части Ruby, хотя я понимаю C. Я мог бы потратить время на чтение, но ваш ответ спас мне время и дал понять. – sawa

+0

Это определенно требует немного практики, чтобы читать Ruby C. Множество макросов - использование 'ruby.h' полезно! –

+0

Или просто прочитайте Рубиния вместо YARV. –