[#28509] Rational — Tadayoshi Funaba <tadf@...>

ふなばです。

49 messages 2006/04/05
[#28510] Re: Rational — keiju@... (石塚圭樹) 2006/04/05

けいじゅ@いしつかです.

[#28512] Re: Rational — Tadayoshi Funaba <tadf@...> 2006/04/05

ふなばです。

[#28513] Re: Rational — Shin-ichiro HARA <sinara@...> 2006/04/05

原です。

[#28514] Re: Rational — keiju@... (石塚圭樹) 2006/04/05

けいじゅ@いしつかです.

[#28517] Re: Rational — Yukihiro Matsumoto <matz@...> 2006/04/06

まつもと ゆきひろです

[#28520] Re: Rational — keiju@... (石塚圭樹) 2006/04/06

けいじゅ@いしつかです.

[#28521] Re: Rational — Yukihiro Matsumoto <matz@...> 2006/04/06

まつもと ゆきひろです

[#28525] Re: Rational — keiju@... (石塚圭樹) 2006/04/06

けいじゅ@いしつかです.

[#28527] Re: Rational — Shin-ichiro HARA <sinara@...> 2006/04/06

原です。

[#28536] Re: Rational — Shin-ichiro HARA <sinara@...> 2006/04/10

原です。

[#28537] Re: Rational — keiju@... (石塚圭樹) 2006/04/10

けいじゅ@いしつかです.

[#28589] Float#div and Float#divmod [AGAIN] — Shin-ichiro HARA <sinara@...>

原です。

16 messages 2006/04/23

[ruby-dev:28587] Re: rational 1.01

From: Tadayoshi Funaba <tadf@...>
Date: 2006-04-22 15:41:36 UTC
List: ruby-dev #28587
ふなばです。

いろいろと提案が受けいれられてうれしいです。

> 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;
       }

In This Thread