[#20525] [BigDecimal] changing rule of coerce — "Tadashi Saito" <shiba@...2.accsnet.ne.jp>

斎藤です。

44 messages 2003/07/07
[#20527] Re: [BigDecimal] changing rule of coerce — "Shigeo Kobayashi" <shigeo@...> 2003/07/07

小林です。

[#20528] Re: [BigDecimal] changing rule of coerce — matz@... (Yukihiro Matsumoto) 2003/07/07

まつもと ゆきひろです

[#20570] Marshal upgrade — matz@... (Yukihiro Matsumoto)

まつもと ゆきひろです

41 messages 2003/07/09
[#20575] Re: Marshal upgrade — Masatoshi SEKI <m_seki@...> 2003/07/09

咳といいます。

[#20583] Re: Marshal upgrade — matz@... (Yukihiro Matsumoto) 2003/07/09

まつもと ゆきひろです

[#21016] Re: Marshal upgrade — matz@... (Yukihiro Matsumoto) 2003/07/30

まつもと ゆきひろです

[#20804] add library — nobu.nakada@... 2003/07/23

なかだです。

[#20580] add library(Re:ruby-dev:20570) — たむらけんいち <sgs02516@...>

たむらです。

30 messages 2003/07/09
[#20656] Re: add library — "NAKAMURA, Hiroshi" <nakahiro@...> 2003/07/14

なひです。

[#20658] Re: add library — GOTOU Yuuzou <gotoyuzo@...> 2003/07/14

In message <038d01c349cb$eaad71d0$93222fc0@sarion.co.jp>,

[#20659] Re: add library — matz@... (Yukihiro Matsumoto) 2003/07/14

まつもと ゆきひろです

[#20660] Re: add library — GOTOU Yuuzou <gotoyuzo@...> 2003/07/14

In message <1058171960.400840.10041.nullmailer@picachu.netlab.jp>,

[#20661] Re: add library — Takahiro Kambe <taca@...> 2003/07/14

話をそらしてしまうかもしれませんが、

[#20665] Re: add library — GOTOU Yuuzou <gotoyuzo@...> 2003/07/14

In message <20030714.183104.09092354.taca@back-street.net>,

[#20666] Re: add library — Takahiro Kambe <taca@...> 2003/07/14

In message <20030715.013655.424936247.gotoyuzo@kotetsu.does.notwork.org>

[#20668] Re: add library — GOTOU Yuuzou <gotoyuzo@...> 2003/07/14

In message <20030715.025907.26217115.taca@back-street.net>,

[#20750] Re: add library — Takahiro Kambe <taca@...> 2003/07/21

In message <20030715.051853.968499478.gotoyuzo@kotetsu.does.notwork.org>

[#20751] Re: add library — GOTOU Yuuzou <gotoyuzo@...> 2003/07/21

In message <20030721.163444.09092937.taca@back-street.net>,

[#20655] frozen ThreadGroup — Hidetoshi NAGAI <nagai@...>

永井@知能.九工大です.

26 messages 2003/07/14
[#20671] Re: frozen ThreadGroup — matz@... (Yukihiro Matsumoto) 2003/07/14

まつもと ゆきひろです

[#20673] Re: frozen ThreadGroup — Hidetoshi NAGAI <nagai@...> 2003/07/15

永井@知能.九工大です.

[#20676] Re: frozen ThreadGroup — matz@... (Yukihiro Matsumoto) 2003/07/15

まつもと ゆきひろです

[#20677] Re: frozen ThreadGroup — Hidetoshi NAGAI <nagai@...> 2003/07/15

永井@知能.九工大です.

[#20681] Re: frozen ThreadGroup — matz@... (Yukihiro Matsumoto) 2003/07/15

まつもと ゆきひろです

[#20690] portable(?) UserID/GroupID control (Re: frozen ThreadGroup) — Hidetoshi NAGAI <nagai@...> 2003/07/16

永井@知能.九工大です.

[#20712] Re: portable(?) UserID/GroupID control — Hidetoshi NAGAI <nagai@...> 2003/07/17

永井@知能.九工大です.

[#20735] Re: portable(?) UserID/GroupID control — matz@... (Yukihiro Matsumoto) 2003/07/20

まつもと ゆきひろです

[#20736] Re: portable(?) UserID/GroupID control — Hidetoshi NAGAI <nagai@...> 2003/07/20

永井@知能.九工大です.

[#20737] Re: portable(?) UserID/GroupID control — matz@... (Yukihiro Matsumoto) 2003/07/20

まつもと ゆきひろです

[#20748] [BigDecimal] exception handling — "Tadashi Saito" <shiba@...2.accsnet.ne.jp>

斎藤です。

20 messages 2003/07/21

[#20765] Re: [ruby-cvs] ruby/lib: * lib/tmpdir.rb: new library to get temporary directory path, — WATANABE Hirofumi <eban@...>

わたなべです。

9 messages 2003/07/21

[#20780] complex.rb — Masahiro TANAKA <masa@...>

complex.rb についての修正案を[ruby-math:00543]で提案しましたが、その後

25 messages 2003/07/22
[#20782] Re: complex.rb — matz@... (Yukihiro Matsumoto) 2003/07/22

まつもと ゆきひろです

[#20900] Re: complex.rb — Masahiro TANAKA <masa@...> 2003/07/25

At Tue, 22 Jul 2003 17:30:31 +0900, Yukihiro Matsumoto wrote:

[#20905] Re: complex.rb — matz@... (Yukihiro Matsumoto) 2003/07/25

まつもと ゆきひろです

[#20906] Re: complex.rb — keiju@... (石塚圭樹) 2003/07/25

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

[#20810] Rational 始めました。 — Shin-ichiro HARA <sinara@...>

原です。

13 messages 2003/07/23
[#20876] Re: Rational 始めました。 — keiju@... (石塚圭樹) 2003/07/24

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

[#20954] ruby 1.8.0 preview5 — matz@... (Yukihiro Matsumoto)

まつもと ゆきひろです

15 messages 2003/07/28

[#20957] [BigDecimal] conflict between Numeric#div and BigDecimal#div — "Tadashi Saito" <shiba@...2.accsnet.ne.jp>

斎藤です。

29 messages 2003/07/28
[#20960] Re: [BigDecimal] conflict between Numeric#div and BigDecimal#div — Masahiro TANAKA <masa@...> 2003/07/28

At Mon, 28 Jul 2003 18:26:20 +0900, Tadashi Saito wrote:

[#20962] Re: [BigDecimal] conflict between Numeric#div and BigDecimal#div — matz@... (Yukihiro Matsumoto) 2003/07/28

まつもと ゆきひろです

[#20990] Re: [BigDecimal] conflict between Numeric#div and BigDecimal#div — Masahiro TANAKA <masa@...> 2003/07/29

At Mon, 28 Jul 2003 21:16:08 +0900, Yukihiro Matsumoto wrote:

[#20992] Re: [BigDecimal] conflict between Numeric#div and BigDecimal#div — matz@... (Yukihiro Matsumoto) 2003/07/29

まつもと ゆきひろです

[ruby-dev:20644] [BigDecimal] dup and to_f

From: "Tadashi Saito" <shiba@...2.accsnet.ne.jp>
Date: 2003-07-12 18:15:01 UTC
List: ruby-dev #20644
斎藤です。

BigDecimalにはBigDecimal#dupが存在しますが、1.8の方針から見ると
望ましくないと思います。
また、BigDecimal#to_fはdupのaliasとして、つまりself(と同じ値)を
そのまま返すよう定義されていますが、やはりFloatを返すべきでしょう。

以上2点を修正してみました。パッチではとりあえず、dupを
USE_MUTABLE_METHODの中に入れる形にして、ドキュメントからは
削除しました。

以下、ドキュメントの修正とまとめてパッチです。小林さん、
取り込んでいただけますでしょうか。

# 値がFloatに収まらないときは、RangeErrorより警告のみの方が
# 良かったりするのでしょうか…エラーにしている箇所が多そう
# だったので、とりあえずそうしてみました。


Index: bigdecimal.c
===================================================================
RCS file: /src/ruby/ext/bigdecimal/bigdecimal.c,v
retrieving revision 1.9
diff -u -r1.9 bigdecimal.c
--- bigdecimal.c 1 Jul 2003 14:14:18 -0000 1.9
+++ bigdecimal.c 12 Jul 2003 17:58:50 -0000
@@ -31,11 +31,13 @@
  */

 #include <ctype.h>
+#include <errno.h>
+#include <float.h>
+#include <math.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include "ruby.h"
-#include "math.h"
 #include "version.h"

 /* #define USE_MUTABLE_METHOD */
@@ -442,6 +444,30 @@
 }

 static VALUE
+BigDecimal_to_f(VALUE self)
+{
+    ENTER(1);
+    Real *p;
+    double d, d2;
+    S_LONG e;
+
+    GUARD_OBJ(p,GetVpValue(self,1));
+    VpVtoD(&d, &e, p);
+    if(d == 0.0 || isinf(d) || isnan(d))
+        return rb_float_new(d);
+    errno = 0;
+    d2 = pow(10.0, e);
+    if(errno == ERANGE || (d2 == 0.0 && d != 0.0)
+       || d > DBL_MAX / d2 || d < DBL_MIN / d2) {
+        U_LONG nc = VpNumOfChars(p)+1;
+        char *psz = ALLOCA_N(char, nc);
+        VpToString(p, psz, 0);
+        rb_raise(rb_eRangeError, "BigDecimal %s out of Float range", psz);
+    }
+    return rb_float_new(d*d2);
+}
+
+static VALUE
 BigDecimal_induced_from(VALUE self, VALUE x)
 {
     Real *p = GetVpValue(x,1);
@@ -867,19 +893,6 @@
 }

 static VALUE
-BigDecimal_dup(VALUE self)
-{
-    ENTER(5);
-    Real *c, *a;
-    U_LONG mx;
-    GUARD_OBJ(a,GetVpValue(self,1));
-    mx = a->Prec *(VpBaseFig() + 1);
-    GUARD_OBJ(c,VpCreateRbObject(mx, "0"));
-    VpAsgn(c, a, 1);
-    return ToValue(c);
-}
-
-static VALUE
 BigDecimal_abs(VALUE self)
 {
     ENTER(5);
@@ -1348,6 +1361,19 @@
     f = VpMult(cv,av,bv);
     return INT2NUM(f);
 }
+
+static VALUE
+BigDecimal_dup(VALUE self)
+{
+    ENTER(5);
+    Real *c, *a;
+    U_LONG mx;
+    GUARD_OBJ(a,GetVpValue(self,1));
+    mx = a->Prec *(VpBaseFig() + 1);
+    GUARD_OBJ(c,VpCreateRbObject(mx, "0"));
+    VpAsgn(c, a, 1);
+    return ToValue(c);
+}
 #endif /* USE_MUTABLE_METHOD */

 void
@@ -1417,8 +1443,7 @@
     rb_define_method(rb_cBigDecimal, "modulo", BigDecimal_mod, 1);
     rb_define_method(rb_cBigDecimal, "remainder", BigDecimal_remainder, 1);
     rb_define_method(rb_cBigDecimal, "divmod", BigDecimal_divmod, 1);
-    rb_define_method(rb_cBigDecimal, "dup", BigDecimal_dup, 0);
-    rb_define_method(rb_cBigDecimal, "to_f", BigDecimal_dup, 0); /* to_f
=== dup */
+    rb_define_method(rb_cBigDecimal, "to_f", BigDecimal_to_f, 0);
     rb_define_method(rb_cBigDecimal, "abs", BigDecimal_abs, 0);
     rb_define_method(rb_cBigDecimal, "sqrt", BigDecimal_sqrt, 1);
     rb_define_method(rb_cBigDecimal, "fix", BigDecimal_fix, 0);
@@ -1457,6 +1482,7 @@
     rb_define_singleton_method(rb_cBigDecimal, "sub!", BigDecimal_sub3, 3);
     rb_define_singleton_method(rb_cBigDecimal, "mult!", BigDecimal_mult3,
3);
     rb_define_singleton_method(rb_cBigDecimal, "div!",BigDecimal_divmod4,
4);
+    rb_define_method(rb_cBigDecimal, "dup", BigDecimal_dup, 0);
 #endif /* USE_MUTABLE_METHOD */
 }

@@ -3415,6 +3441,21 @@
         *d = VpGetDoubleNegZero();
         *e = 0;
         goto Exit;
+    } else
+    if(VpIsPosInf(m)) {
+        *d = VpGetDoublePosInf();
+        *e = 0;
+        goto Exit;
+    } else
+    if(VpIsNegInf(m)) {
+        *d = VpGetDoubleNegInf();
+        *e = 0;
+        goto Exit;
+    } else
+    if(VpIsNaN(m)) {
+        *d = VpGetDoubleNaN();
+        *e = 0;
+        goto Exit;
     }
     ind_m = 0;
     mm = Min(fig,(m->Prec));
Index: bigdecimal_en.html
===================================================================
RCS file: /src/ruby/ext/bigdecimal/bigdecimal_en.html,v
retrieving revision 1.4
diff -u -r1.4 bigdecimal_en.html
--- bigdecimal_en.html 27 Jun 2003 04:38:57 -0000 1.4
+++ bigdecimal_en.html 12 Jul 2003 17:58:50 -0000
@@ -394,8 +394,7 @@

 </BLOCKQUOTE>
 <LI><B>to_f</B></LI><BLOCKQUOTE>
-same as dup method.
-creates a new BigDecimal object having same value.
+creates a new Float object having same value.
 </BLOCKQUOTE>

 </BLOCKQUOTE>
@@ -455,10 +454,6 @@
 '0.314E1' is the value,4 is the number of the significant digits,
 and 12 is the maximum number of the significant digits
 the object can hold.
-
-</BLOCKQUOTE>
-<LI><B>dup</B></LI><BLOCKQUOTE>
-creates a new BigDecimal object having same value.

 </BLOCKQUOTE>
 <LI><B>sqrt</B></LI><BLOCKQUOTE>
Index: bigdecimal_ja.html
===================================================================
RCS file: /src/ruby/ext/bigdecimal/bigdecimal_ja.html,v
retrieving revision 1.4
diff -u -r1.4 bigdecimal_ja.html
--- bigdecimal_ja.html 27 Jun 2003 04:38:57 -0000 1.4
+++ bigdecimal_ja.html 12 Jul 2003 17:58:51 -0000
@@ -374,8 +374,7 @@
 a が Infinity や NaN のとき、i は nil になります。
 </BLOCKQUOTE>
 <LI><B>to_f</B></LI><BLOCKQUOTE>
-dup と全く同じです。
-同じ値の BigDecimal オブジェクトを生成します。
+同じ値の Float オブジェクトを生成します。
 </BLOCKQUOTE>
 <LI><B>to_s[(n)]</B></LI><BLOCKQUOTE>
 文字列に変換します("0.xxxxxEn"の形になります)。<BR>
@@ -444,9 +443,6 @@
 次の4は現在の有効桁数(表示より若干大きいことがあります)、
 最後はオブジェクトが取り得る最大桁数になります。

-</BLOCKQUOTE>
-<LI><B>dup</B></LI><BLOCKQUOTE>
-同じ値の BigDecimal オブジェクトを生成します。
 </BLOCKQUOTE>
 <LI><B>sqrt</B></LI><BLOCKQUOTE>
 aの有効桁 n 桁の平方根(n の平方根ではありません)。


---
斎藤ただし


In This Thread

Prev Next