From: Tanaka Akira Date: 2007-07-15T23:37:08+09:00 Subject: [ruby-dev:31236] rb_big_pow ふと test_integer.rb の実行を callgrind をかけて、bignum.c を眺めていると、rb_big_pow の中に実行されない部分があるのに 気がつきました。そしてしばらく眺めた結果、n という変数はずっ と 1 なことに気がついてしまいました。なにか変だと思うんです が、どうなんでしょう? ... case T_FIXNUM: yy = FIX2LONG(y); if (yy > 0) { VALUE z = 0; SIGNED_VALUE mask, n = 1; // ここで 1 を設定 ... for (mask = FIXNUM_MAX + 1; mask; mask >>= 1) { if (!z) { SIGNED_VALUE n2 = n * n; // 1 * 1 は 1 if (!POSFIXABLE(n2) || (n2 / n != n)) { // 条件は成立しない z = bigtrunc(bigsqr(rb_int2big(n))); // ここは実行されない } else { n = n2; // ここで 1 を代入 } } else { z = bigtrunc(bigsqr(z)); } if (yy & mask) { if (!z) z = rb_int2big(n); // rb_int2bigには常に 1 を渡す z = bigtrunc(rb_big_mul0(z, x)); } } return bignorm(z); } d = (double)yy; break; ... -- [田中 哲][たなか あきら][Tanaka Akira]