From 2b5a14bf7c96fcda9ff6cd9bbdd83d9294a0d354 Mon Sep 17 00:00:00 2001 From: matz Date: Fri, 7 May 2004 08:48:30 +0000 Subject: * eval.c (rb_eval): too many line trace call. (ruby-bugs PR#1320) * numeric.c (flo_to_s): tweak output string based to preserve decimal point and to remove trailing zeros. [ruby-talk:97891] * string.c (rb_str_index_m): use unsigned comparison for T_FIXNUM search. [ruby-talk:97342] * hash.c (rb_hash_equal): returns true if two hashes have same set of key-value set. [ruby-talk:97559] * hash.c (rb_hash_eql): returns true if two hashes are equal and have same default values. * string.c (rb_str_equal): always returns true or false, never returns nil. [ruby-dev:23404] * io.c (rb_io_reopen): should use rb_io_check_io(). git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@6263 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- numeric.c | 34 +++++++++++++--------------------- 1 file changed, 13 insertions(+), 21 deletions(-) (limited to 'numeric.c') diff --git a/numeric.c b/numeric.c index 513b43b48c..ac5e125a8f 100644 --- a/numeric.c +++ b/numeric.c @@ -489,37 +489,29 @@ flo_to_s(flt) VALUE flt; { char buf[32]; - char *fmt = "%.15g"; + char *fmt = "%.15f"; double value = RFLOAT(flt)->value; double avalue, d1, d2; + char *p, *e; if (isinf(value)) return rb_str_new2(value < 0 ? "-Infinity" : "Infinity"); else if(isnan(value)) return rb_str_new2("NaN"); - + avalue = fabs(value); - if (avalue == 0.0) { - fmt = "%.1f"; - } - else if (avalue < 1.0e-3) { - d1 = avalue; - while (d1 < 1.0) d1 *= 10.0; - d1 = modf(d1, &d2); - if (d1 == 0) fmt = "%.1e"; - } - else if (avalue >= 1.0e15) { - d1 = avalue; - while (d1 > 10.0) d1 /= 10.0; - d1 = modf(d1, &d2); - if (d1 == 0) fmt = "%.1e"; - else fmt = "%.16e"; + if (avalue < 1.0e-7 || avalue >= 1.0e15) { + fmt = "%.16e"; } - else if ((d1 = modf(value, &d2)) == 0) { - fmt = "%.1f"; - } sprintf(buf, fmt, value); - + if (!(e = strchr(buf, 'e'))) { + e = buf + strlen(buf); + } + p = e; + while (*--p=='0') + ; + if (*p == '.') *p++; + memmove(p+1, e, strlen(e)+1); return rb_str_new2(buf); } -- cgit v1.2.3