aboutsummaryrefslogtreecommitdiff
path: root/libgfortran
diff options
context:
space:
mode:
authorpbrook <pbrook@138bc75d-0d04-0410-961f-82ee72b054a4>2003-09-09 18:13:08 +0000
committerpbrook <pbrook@138bc75d-0d04-0410-961f-82ee72b054a4>2003-09-09 18:13:08 +0000
commit6d72c56f5074a0885b14668c4d49a5e72d009f8b (patch)
tree5278af4d99ef580b1a948c9e90cc531c0c0653a5 /libgfortran
parent364e236485fb1b730ef9768e8cfdcf4946650f4a (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/ChangeLog7
-rw-r--r--libgfortran/io/write.c77
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;
}
}