mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* numeric.c (flo_to_s): p 0.0 should be '0.0' not '0.0e+00'.
* numeric.c (flo_to_s): the number of significand is correctly handled, there is assumption that DBL_DIG == 15 though. (p 0.00000000000000000001 was '9.999999999999999e-21', now is '1.0e-20') git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@6346 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
14b693c1b3
commit
a655b0d8e1
2 changed files with 19 additions and 11 deletions
|
@ -1,3 +1,12 @@
|
||||||
|
Mon May 17 16:04:06 Hirokazu Yamamoto <ocean@m2.ccsnet.ne.jp>
|
||||||
|
|
||||||
|
* numeric.c (flo_to_s): p 0.0 should be '0.0' not '0.0e+00'.
|
||||||
|
|
||||||
|
* numeric.c (flo_to_s): the number of significand is correctly handled,
|
||||||
|
there is assumption that DBL_DIG == 15 though.
|
||||||
|
(p 0.00000000000000000001 was '9.999999999999999e-21', now is
|
||||||
|
'1.0e-20')
|
||||||
|
|
||||||
Mon May 17 00:36:21 2004 why the lucky stiff <why@ruby-lang.org>
|
Mon May 17 00:36:21 2004 why the lucky stiff <why@ruby-lang.org>
|
||||||
|
|
||||||
* lib/yaml/baseemitter.rb (indent_text): was forcing a mod value
|
* lib/yaml/baseemitter.rb (indent_text): was forcing a mod value
|
||||||
|
|
21
numeric.c
21
numeric.c
|
@ -490,9 +490,7 @@ flo_to_s(flt)
|
||||||
VALUE flt;
|
VALUE flt;
|
||||||
{
|
{
|
||||||
char buf[32];
|
char buf[32];
|
||||||
char *fmt = "%.15f";
|
|
||||||
double value = RFLOAT(flt)->value;
|
double value = RFLOAT(flt)->value;
|
||||||
double avalue, d1, d2;
|
|
||||||
char *p, *e;
|
char *p, *e;
|
||||||
|
|
||||||
if (isinf(value))
|
if (isinf(value))
|
||||||
|
@ -500,19 +498,20 @@ flo_to_s(flt)
|
||||||
else if(isnan(value))
|
else if(isnan(value))
|
||||||
return rb_str_new2("NaN");
|
return rb_str_new2("NaN");
|
||||||
|
|
||||||
avalue = fabs(value);
|
sprintf(buf, "%#.15g", value); /* ensure to print decimal point */
|
||||||
if (avalue < 1.0e-7 || avalue >= 1.0e15) {
|
|
||||||
fmt = "%.15e";
|
|
||||||
}
|
|
||||||
sprintf(buf, fmt, value);
|
|
||||||
if (!(e = strchr(buf, 'e'))) {
|
if (!(e = strchr(buf, 'e'))) {
|
||||||
e = buf + strlen(buf);
|
e = buf + strlen(buf);
|
||||||
}
|
}
|
||||||
|
if (!ISDIGIT(e[-1])) { /* reformat if ended with decimal point (ex 111111111111111.) */
|
||||||
|
sprintf(buf, "%#.14e", value);
|
||||||
|
if (!(e = strchr(buf, 'e'))) {
|
||||||
|
e = buf + strlen(buf);
|
||||||
|
}
|
||||||
|
}
|
||||||
p = e;
|
p = e;
|
||||||
while (*--p=='0')
|
while (p[-1]=='0' && ISDIGIT(p[-2]))
|
||||||
;
|
p--;
|
||||||
if (*p == '.') *p++;
|
memmove(p, e, strlen(e)+1);
|
||||||
memmove(p+1, e, strlen(e)+1);
|
|
||||||
return rb_str_new2(buf);
|
return rb_str_new2(buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue