[#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:20595] Re: [BigDecimal] changing rule of coerce

From: "Tadashi Saito" <shiba@...2.accsnet.ne.jp>
Date: 2003-07-10 06:27:20 UTC
List: ruby-dev #20595
斎藤です。

一貫性の話は、他の重鎮の方々から出ているので略させていただきます。

----- Original Message ----- 
From: "Shigeo Kobayashi" <shigeo@tinyforest.gr.jp>
Sent: Tuesday, July 08, 2003 5:30 PM
Subject: [ruby-dev:20551] Re: [BigDecimal] changing rule of coerce

> > いっそのこと、builtin classにしてBigDecimalリテラルを用意するとい
> > うのはどうでしょうか?
> > 「1.234B」みたいな。
> 最善と思いますが、多分 Rational を builtin するよりももっと面倒そう...

自分も「将来的には」、BigDecimalをbuiltinにすることを推します。
Floatの誤差というのは、何もしないと2**32(64)以上の大きな整数が
扱えないという問題と同種で、計算機内部の事情だと思うからです。

その「事情」を知らない人の驚きをなくすため、Bignumがあるわけですよね。
そういう意味で、BigDecimalはとっても大事なライブラリだと思うわけです。
(「驚き」の事例は、ruby-listで何回も出てますね)

FixnumとBignumとの関係と同じく、同じ表記の小数リテラルで

・誤差が出ない表記の小数は速いFloatに
・誤差が出てしまう小数は正確なBigDecimalに

というのがある意味の理想だと思います。しかし、

・誤差が出るか出ないかの判定が面倒でパフォーマンス低下
・どのみち、誤差が出てしまう場面の方が圧倒的に多そう
・結果ほとんどBigDecimal演算になり、遅くなる
・誤差がそのまま出る言語処理系がほとんどだから、「驚き」が
 「常識」になっているユーザも多いので、元からあんまり
 正確さを期待されてない

ということで、デフォルトでBigDecimalが多く出るというのは
難しいですよね。

一番簡単そうという理由で、自分はユーザによる明示的な
接尾子案を推します。
「『B』をつけるだけで、小数は正確に計算されるようになります」
なんて、かっこいいと思います。



ただそれは大きな変更になりそうなので、あくまでも1.9以降、と
いう事になってしまうと思います。

それでつなぎとして、String#to_d でも用意しませんか?
Rational には Integer#to_r もあることですし。

BigDecimal("1.23")

と比べたら、

"1.23".to_d

のタイプ数は 5-12=-7、実に6割弱減です! (^^)

ということで、以下パッチです。ちなみにto_dという名前は、
既存の bigdecimal-rational から採りました。
# ついでに Fixnum#to_d と Bignum#to_d もつけてます。

Index: bigdecimal.c
===================================================================
RCS file: /src/ruby/ext/bigdecimal/bigdecimal.c,v
retrieving revision 1.9
diff -u -p -r1.9 bigdecimal.c
--- bigdecimal.c        1 Jul 2003 14:14:18 -0000       1.9
+++ bigdecimal.c        10 Jul 2003 05:39:34 -0000
@@ -1253,6 +1253,43 @@ BigDecimal_sincos(VALUE self, VALUE nFig
     return obj;
 }

+static VALUE
+str_to_d(VALUE str)
+{
+    ENTER(1);
+    Real *a;
+
+    SafeStringValue(str);
+    GUARD_OBJ(a, VpCreateRbObject(strlen(RSTRING(str)->ptr) + VpBaseFig() +
1,
+                                RSTRING(str)->ptr));
+    return ToValue(a);
+}
+
+static VALUE
+fix_to_d(VALUE num)
+{
+    ENTER(1);
+    Real *a;
+    char szD[128];
+
+    sprintf(szD, "%d", FIX2INT(num));
+    GUARD_OBJ(a,VpCreateRbObject(VpBaseFig() * 2 + 1, szD));
+    return ToValue(a);
+}
+
+static VALUE
+big_to_d(VALUE x)
+{
+    ENTER(1);
+    Real *a;
+    VALUE bg;
+
+    bg = rb_big2str(x, 10);
+    GUARD_OBJ(a,VpCreateRbObject(strlen(RSTRING(bg)->ptr) + VpBaseFig() +
1,
+                                RSTRING(bg)->ptr));
+    return ToValue(a);
+}
+

 #ifdef USE_MUTABLE_METHOD
 /**** Following methods are all MUTABLE and not currently activated. ****/
@@ -1450,6 +1487,11 @@ Init_bigdecimal(void)
     rb_define_method(rb_cBigDecimal, "finite?",   BigDecimal_IsFinite, 0);
     rb_define_method(rb_cBigDecimal, "truncate",  BigDecimal_truncate, -1);
     rb_define_method(rb_cBigDecimal, "_dump", BigDecimal_dump, -1);
+
+    /* misc utility methods */
+    rb_define_method(rb_cString, "to_d", str_to_d, 0);
+    rb_define_method(rb_cFixnum, "to_d", fix_to_d, 0);
+    rb_define_method(rb_cBignum, "to_d", big_to_d, 0);

 #ifdef USE_MUTABLE_METHOD
     rb_define_singleton_method(rb_cBigDecimal, "assign!",
BigDecimal_assign, 3);


---
斎藤ただし


In This Thread