Failure of default_format_1.f90

FX Coudert fxcoudert@gmail.com
Wed Oct 3 20:36:00 GMT 2007


> It appears that either your testcase is bogus or (as I feared)
> you broke gfortran cratering to the darwin platform.

I have not committed any patch addressing a darwin issue (except  
xfailing two testcases after having shown that darwin system  
libraries were broken; see below). Please refrain from  
unsubstantiated claims, as it's really counterproductive (and, on  
this occasion, doesn't give me ). I have already said I do understand  
your concerns that maintainability is a key element in evaluating  
bugs and patches, and I'll stick to it. You can review the patch that  
caused this, and tell me how it burdens maintainance:

2007-10-02  Francois-Xavier Coudert  <fxcoudert@gcc.gnu.org>

         PR fortran/33469
         * io/write.c (write_real): Widen the default formats.

--- trunk/libgfortran/io/write.c	2007/10/02 20:56:47	128966
+++ trunk/libgfortran/io/write.c	2007/10/02 23:27:51	128967
@@ -698,18 +698,18 @@
    switch (length)
      {
      case 4:
-      f.u.real.w = 14;
-      f.u.real.d = 7;
+      f.u.real.w = 15;
+      f.u.real.d = 8;
        f.u.real.e = 2;
        break;
      case 8:
-      f.u.real.w = 23;
-      f.u.real.d = 15;
+      f.u.real.w = 25;
+      f.u.real.d = 17;
        f.u.real.e = 3;
        break;
      case 10:
-      f.u.real.w = 28;
-      f.u.real.d = 19;
+      f.u.real.w = 29;
+      f.u.real.d = 20;
        f.u.real.e = 4;
        break;
      case 16:



As for the failure, you don't say which target you're talking about,  
but I take it to be x86_64-freebsd. That means that writing denormals  
and reading them back doesn't yield the same value. Now, this could  
be because the field is not large enough, but then it'd be a generic  
x86 failure, no freebsd specific (testcase works fine on x86_64- 
linux). So, it's probably a problem with freebsd's printf().

$ cat u.f90
program p
   real(kind=8) :: x, y
   character(len=100) :: s
   print '(I0,1X,I0)', digits(1.d0), precision(1.d0)

   x = tiny(x)
   write (s,*) x
   read (s,*) y
   print *, x
   print *, y

   x = 2.22507385850710603d-308
   write (s,*) x
   read (s,*) y
   print *, x
   print *, y
end program p
$ gfortran u.f90 && ./a.out
53 15
   2.22507385850720138E-308
   2.22507385850720138E-308
   2.22507385850710603E-308
   2.22507385850710603E-308


I've already seen such failures on Darwin (both ppc and x86) and have  
thus xfail'ed this testcase there, I can add freebsd to that xfail  
target list. Or, I could just tweak the testcase not to test  
denormals (patch provided below), but I think there's no reason to  
treat them separately.

Index: default_format_1.f90
===================================================================
--- default_format_1.f90        (revision 128992)
+++ default_format_1.f90        (working copy)
@@ -86,15 +86,15 @@ program main
    if (test (1.0_4, 0) /= 0) call abort
    if (test (0.0_4, 0) /= 0) call abort
-  if (test (tiny(0.0_4), 0) /= 0) call abort
-  if (test (-tiny(0.0_4), 0) /= 0) call abort
+  if (test (tiny(0.0_4), 1) /= 0) call abort
+  if (test (-tiny(0.0_4), -1) /= 0) call abort
    if (test (huge(0.0_4), -1) /= 0) call abort
    if (test (-huge(0.0_4), 1) /= 0) call abort
    if (test (1.0_8, 0) /= 0) call abort
    if (test (0.0_8, 0) /= 0) call abort
-  if (test (tiny(0.0_8), 0) /= 0) call abort
-  if (test (-tiny(0.0_8), 0) /= 0) call abort
+  if (test (tiny(0.0_8), 1) /= 0) call abort
+  if (test (-tiny(0.0_8), -1) /= 0) call abort
    if (test (huge(0.0_8), -1) /= 0) call abort
    if (test (-huge(0.0_8), 1) /= 0) call abort
Index: default_format_2.f90
===================================================================
--- default_format_2.f90        (revision 128992)
+++ default_format_2.f90        (working copy)
@@ -56,8 +56,8 @@ program main
    if (test (1.0_kl, 0) /= 0) call abort
    if (test (0.0_kl, 0) /= 0) call abort
-  if (test (tiny(0.0_kl), 0) /= 0) call abort
-  if (test (-tiny(0.0_kl), 0) /= 0) call abort
+  if (test (tiny(0.0_kl), 1) /= 0) call abort
+  if (test (-tiny(0.0_kl), -1) /= 0) call abort
    if (test (huge(0.0_kl), -1) /= 0) call abort
    if (test (-huge(0.0_kl), 1) /= 0) call abort



>        x =   2.22507385850710603E-308
>  trim(s) =   2.22507385850710603E-308
>        y =   2.22507385850710652E-308
>
> program p
>   print '(I0,1X,I0)', digits(1.d0), precision(1.d0)
> end program p
> troutmask:sgk[243] gfc4x -o z p.f90
> troutmask:sgk[244] ./z
> 53 15
>
> 1 23456789012345
> 2.22507385850710652E-308
>                 ^^^
> There are garbage.
>
> One can either check /usr/include/float.h of the expected
> number of decimal digits or use real_info->precision to
> determine a desirable value.

A desirable value for what? That paragraph leaves me quite puzzled.

Regards,
FX




More information about the Fortran mailing list