Index: numeric.c =================================================================== --- numeric.c (revision 27054) +++ numeric.c (working copy) @@ -547,16 +547,16 @@ /* * call-seq: - * flt.to_s -> string + * flt.inspect -> string * - * Returns a string containing a representation of self. As well as a + * Returns a string containing a full representation of self. As well as a * fixed or exponential form of the number, the call may return * ``NaN'', ``Infinity'', and * ``-Infinity''. */ static VALUE -flo_to_s(VALUE flt) +flo_inspect(VALUE flt) { enum {decimal_mant = DBL_MANT_DIG-DBL_DIG}; enum {float_dig = DBL_DIG+1}; @@ -590,6 +590,46 @@ } /* + * call-seq: + * flt.to_s => string + * + * Returns a string containing a human readable representation of self. As well as a + * fixed or exponential form of the number, the call may return + * ``NaN'', ``Infinity'', and + * ``-Infinity''. + */ + +static VALUE +flo_to_s(VALUE flt) +{ + char buf[32]; + double value = RFLOAT_VALUE(flt); + char *p, *e; + + if (isinf(value)) + return rb_usascii_str_new2(value < 0 ? "-Infinity" : "Infinity"); + else if(isnan(value)) + return rb_usascii_str_new2("NaN"); + + snprintf(buf, sizeof(buf), "%#.15g", 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); + if (!(e = strchr(buf, 'e'))) { + e = buf + strlen(buf); + } + } + p = e; + while (p[-1]=='0' && ISDIGIT(p[-2])) + p--; + memmove(p, e, strlen(e)+1); + return rb_usascii_str_new2(buf); +} + + +/* * MISSING: documentation */ @@ -3339,6 +3379,7 @@ rb_define_const(rb_cFloat, "NAN", DBL2NUM(NAN)); rb_define_method(rb_cFloat, "to_s", flo_to_s, 0); + rb_define_method(rb_cFloat, "inspect", flo_inspect, 0); rb_define_method(rb_cFloat, "coerce", flo_coerce, 1); rb_define_method(rb_cFloat, "-@", flo_uminus, 0); rb_define_method(rb_cFloat, "+", flo_plus, 1);