[前][次][番号順一覧][スレッド一覧]

ruby-changes:11178

From: nobu <ko1@a...>
Date: Thu, 5 Mar 2009 18:36:49 +0900 (JST)
Subject: [ruby-changes:11178] Ruby:r22783 (trunk): * numeric.c (flo_to_s): keeps enough precision for round trip.

nobu	2009-03-05 18:36:39 +0900 (Thu, 05 Mar 2009)

  New Revision: 22783

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=22783

  Log:
    * numeric.c (flo_to_s): keeps enough precision for round trip.
      [ruby-core:22325]

  Modified files:
    trunk/ChangeLog
    trunk/numeric.c

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 22782)
+++ ChangeLog	(revision 22783)
@@ -1,3 +1,8 @@
+Thu Mar  5 18:36:38 2009  Nobuyoshi Nakada  <nobu@r...>
+
+	* numeric.c (flo_to_s): keeps enough precision for round trip.
+	  [ruby-core:22325]
+
 Thu Mar  5 16:56:14 2009  Nobuyoshi Nakada  <nobu@r...>
 
 	* lib/tmpdir.rb (Dir.tmpdir): not use USERPROFILE, and ignores
Index: numeric.c
===================================================================
--- numeric.c	(revision 22782)
+++ numeric.c	(revision 22783)
@@ -521,7 +521,9 @@
 static VALUE
 flo_to_s(VALUE flt)
 {
-    char buf[32];
+    enum {decimal_mant = DBL_MANT_DIG-DBL_DIG};
+    enum {float_dig = DBL_DIG+2};
+    char buf[float_dig + (decimal_mant + CHAR_BIT - 1) / CHAR_BIT + 10];
     double value = RFLOAT_VALUE(flt);
     char *p, *e;
 
@@ -530,12 +532,12 @@
     else if(isnan(value))
 	return rb_usascii_str_new2("NaN");
 
-    snprintf(buf, sizeof(buf), "%#.15g", value); /* ensure to print decimal point */
+    snprintf(buf, sizeof(buf), "%#.*g", float_dig, value); /* ensure to print decimal point */
     if (!(e = strchr(buf, 'e'))) {
 	e = buf + strlen(buf);
     }
     if (!ISDIGIT(e[-1])) { /* reformat if ended with decimal point (ex 111111111111111.) */
-	snprintf(buf, sizeof(buf), "%#.14e", value);
+	snprintf(buf, sizeof(buf), "%#.*e", float_dig - 1, value);
 	if (!(e = strchr(buf, 'e'))) {
 	    e = buf + strlen(buf);
 	}

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]