From: TAKANO Mitsuhiro Date: 2009-11-18T12:09:38+09:00 Subject: [ruby-dev:39713] Re: [Bug #2381] Math.gammaの挙動がx86_64とia64で異なる こんにちは 高野です。 U.Nakamura さんは書きました: > こんにちは、なかむら(う)です。 > > In message "[ruby-dev:39710] [Bug #2381] Math.gammaの挙動がx86_64とia64で異なる" > on Nov.18,2009 11:30:57, wrote: > >> math.cの671行目付近での 0 < intpart という条件式にて intpart が 0 よりも微妙に大きい double型であったため、意図した処理ではなくなったように思える。 >> > > modf()の仕様的に考えて、よっぽど腐ったライブラリ実装でない限 > り、intpartが0より大きく1より小さい値になることはありえないと > 考えられます。 > > 実際の問題は、その次の行で不用意にintpartをintにキャストして > いることにあります。 > IRCはいろいろ教えていただきありがとうございます。 結局、int型がでてくるのがおかしい、ということになり、 なかださん提案の以下のパッチを r25836 にてコミットしました。 ありがとうございます。 m(_ _)m Index: math.c =================================================================== --- math.c (revision 25834) +++ math.c (working copy) @@ -666,14 +666,13 @@ }; double d0, d; double intpart, fracpart; - int n; Need_Float(x); d0 = RFLOAT_VALUE(x); fracpart = modf(d0, &intpart); if (fracpart == 0.0 && 0 < intpart && - (n = (int)intpart - 1) < numberof(fact_table)) { - return DBL2NUM(fact_table[n]); + intpart - 1 < (double)numberof(fact_table)) { + return DBL2NUM(fact_table[(int)intpart - 1]); } errno = 0; d = tgamma(d0);