2012-01-01 31 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

,你可以阅读源,看看youself ... – DGM 2012-01-01 04:39:02

+0

你看看源? – 2012-01-01 04:42:10

+0

我不习惯Ruby的C部分。 – sawa 2012-01-01 04:52:26

回答

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,但我不习惯C语言的Ruby部分。我可以花时间阅读它,但是你的回答为我节省了时间,并且使它更加清晰。 – sawa 2012-01-01 04:55:54

+0

这绝对需要一些练习来阅读Ruby C.很多宏 - 具有'ruby.h'方便是件好事! – 2012-01-01 04:57:31

+0

或者只是阅读Rubinius而不是YARV。 – 2012-01-01 05:45:53