From: Tadayoshi Funaba Date: 2006-04-23T00:41:36+09:00 Subject: [ruby-dev:28587] Re: rational 1.01 ふなばです。 いろいろと提案が受けいれられてうれしいです。 > Scheme には rationalize->exact というのもありますね。いずれにして > も有理数を rationalize するという言葉使いはおかしくて、Haskell の > approxRational という名前が適当かもしれない。第2引数を取らない > Common Lisp の rationalize は納得できます。 rationalize->exact は、MIT Scheme の拡張みたいですが、どちらかというと、 こっちに近いんでしょうね。 名前がヘンじゃないかというのは、そうなのかな、というのはありますが、 Common Lisp にしても、有理数を受けとりますし、Scheme では、非厳密数を つかった計算は原則的に非厳密数を返すことになるので、有理数が返るとは限 らないわけで。しかし、やっぱり approxRational みたいなのがいいんですか ね。 ところで、Scheme の inexact->exact も Haskell の approxRational も第二 引数は負数でも構わないようです。なので、特別な理由がなければ、そうして もいいかなと思いました。 あと、rationalize 中の同値判定がおかしいように思うのですが、確認をお願 いします。 --- rational.c.orig Tue Apr 18 20:28:12 2006 +++ rational.c Sat Apr 22 23:56:21 2006 @@ -478,5 +478,5 @@ return RT_NEW2(RT_MINUS(snum, RT_MUL(other, sden)), sden); case T_FLOAT: - return RT_PLUS(rb_rat_to_f(self), RT_UMINUS(other)); + return RT_MINUS(rb_rat_to_f(self), other); default: @@ -942,5 +942,5 @@ if (RT_NEG(eps)) { - rb_raise(rb_eArgError, "precision is negative."); + eps = RT_UMINUS(eps); } @@ -962,5 +962,5 @@ RT_read2(x, xn, xd); RT_read2(y, yn, yd); - if (RT_EQ(xn, xd) && RT_EQ(yn, yd)) { + if (RT_EQ(xn, yn) && RT_EQ(xd, yd)) { return x; } @@ -1359,5 +1359,5 @@ if (RT_NEG(eps)) { - rb_raise(rb_eArgError, "precision is negative."); + eps = RT_UMINUS(eps); } @@ -1601,5 +1601,5 @@ if (RT_NEG(eps)) { - rb_raise(rb_eArgError, "precision is negative."); + eps = RT_UMINUS(eps); } @@ -1614,5 +1614,5 @@ RT_read2(x, xn, xd); RT_read2(y, yn, yd); - if (RT_EQ(xn, xd) && RT_EQ(yn, yd)) { + if (RT_EQ(xn, yn) && RT_EQ(xd, yd)) { return x; }