diff options
author | pbrook <pbrook@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-09-09 18:13:08 +0000 |
---|---|---|
committer | pbrook <pbrook@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-09-09 18:13:08 +0000 |
commit | 6d72c56f5074a0885b14668c4d49a5e72d009f8b (patch) | |
tree | 5278af4d99ef580b1a948c9e90cc531c0c0653a5 /libgfortran | |
parent | 364e236485fb1b730ef9768e8cfdcf4946650f4a (diff) |
* io/write.c (write_float): Dectection of positive infinite number,
Not a Number(NaN) and negative infinite number.
(ioutput_float): Bug fix for FMT_E and FMT_D processing to
output a very_very small number ( < 0.1e-100 ).
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/tree-ssa-20020619-branch@71239 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libgfortran')
-rw-r--r-- | libgfortran/ChangeLog | 7 | ||||
-rw-r--r-- | libgfortran/io/write.c | 77 |
2 files changed, 58 insertions, 26 deletions
diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog index 3a4d20b5613..6cc8f433f52 100644 --- a/libgfortran/ChangeLog +++ b/libgfortran/ChangeLog @@ -1,3 +1,10 @@ +2003-09-09 XiaoQiang Zhang <zhangapache@yahoo.com> + + * io/write.c (write_float): Dectection of positive infinite number, + Not a Number(NaN) and negative infinite number. + (ioutput_float): Bug fix for FMT_E and FMT_D processing to + output a very_very small number ( < 0.1e-100 ). + 2003-09-07 XiaoQiang Zhang (zhangapache@yahoo.com> * libgfortran.h (xtoa, itoa): Parameter modified. diff --git a/libgfortran/io/write.c b/libgfortran/io/write.c index 28a9cd28262..8fecfe336b9 100644 --- a/libgfortran/io/write.c +++ b/libgfortran/io/write.c @@ -269,15 +269,16 @@ calculate_G_format (fnode *f, double value, int len, int *num_blank) static void output_float (fnode *f, double value, int len) { - int w, d, e; + int w, d, e, e_new; int digits; int nsign, nblank, nesign; int sca, neval, itmp; char *p; - const char *q, *intstr; + const char *q, *intstr, *base; double n; format_token ft; char exp_char = 'E'; + int with_exp = 1; int scale_flag = 1 ; double minv = 0.0, maxv = 0.0; sign_t sign = SIGN_NONE, esign = SIGN_NONE; @@ -300,7 +301,7 @@ output_float (fnode *f, double value, int len) if (n < 0) n = -n; - nsign = sign == SIGN_NONE ? 0 : 1; + nsign = (sign == SIGN_NONE ? 0 : 1); digits = 0; if (ft != FMT_F) @@ -362,21 +363,6 @@ output_float (fnode *f, double value, int len) } if (ft != FMT_F) { - j = neval; - if (e <= 0) - { - while (j > 0) - { - j = j / 10; - e ++ ; - } - if (e <= 0) - e = 2; - } - - if (e < digits) - e = digits ; - if (neval >= 0) esign = SIGN_PLUS; else @@ -385,9 +371,22 @@ output_float (fnode *f, double value, int len) neval = - neval ; } - nesign = 1 ; + e_new = 0; + j = neval; + while (j > 0) + { + j = j / 10; + e_new ++ ; + } + if (e <= e_new) + e = e_new; + + if (e < digits) + e = digits ; + + nesign = 1 ; /* position for exp_char */ if (e > 0) - nesign = e + nesign ; + nesign = e + nesign + (esign != SIGN_NONE ? 1 : 0); } intval = n; @@ -405,7 +404,16 @@ output_float (fnode *f, double value, int len) if (p == NULL) return; - nblank = w - (nsign + intlen + d + nesign + (ft == FMT_F ? 0 : 1) ); + base = p; + + nblank = w - (nsign + intlen + d + nesign); + if (nblank == -1 && ft != FMT_F) + { + with_exp = 0; + nesign -= 1; + nblank = w - (nsign + intlen + d + nesign); + } + if (nblank < 0) { star_fill (p, w); @@ -431,7 +439,8 @@ output_float (fnode *f, double value, int len) if (e > 0 && nesign > 0) { - *p++ = exp_char; + if (with_exp) + *p++ = exp_char; switch (esign) { case SIGN_PLUS: @@ -445,6 +454,7 @@ output_float (fnode *f, double value, int len) } q = itoa (neval); digits = strlen (q); + for (itmp = 0; itmp < e - digits; itmp++) *p++ = '0'; memcpy (p, q, digits); @@ -462,20 +472,35 @@ static void write_float (fnode *f, const char *source, int len) { double n; - int nb =0 ; - char * p; + int nb =0, res; + char * p, fin; fnode *f2 = NULL; n = extract_real (source, len); if (f->format != FMT_B && f->format != FMT_O && f->format != FMT_Z) { - if (isinf (n)) + res = finite (n); + if (res == 0) { nb = f->u.real.w; + if (nb <= 4) + nb = 4; p = write_block (nb); memset (p, ' ' , 1); - memset (p+1, '+' , nb-1); + + res = isinf (n); + if (res != 0) + { + if (res > 0) + fin = '+'; + else + fin = '-'; + + memset (p + 1, fin, nb - 1); + } + else + sprintf(p + 1, "NaN"); return; } } |