This is the mail archive of the fortran@gcc.gnu.org mailing list for the GNU Fortran project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Default format for Float128


On 09/01/2010 08:54 PM, Jerry DeLisle wrote:
Regarding isfinite used in write_float.def

The following test taken from comment #19 of pr24685 fails with the new
quad float patch on x86-64. The values come out +Infinity on my system
here.

program huge_real10_formatted
integer, parameter :: k = 16
real(kind=k) :: a,b(2), c
character(len=180) :: tmp
! Test real(k) scalar and array formatted IO with big value
b(:) = huge (1.0_k)/2
print *, 'real(16) big value: ', b(1)
write (tmp, *) b
read (tmp, *) a, c
print *, 'same value read again: ', a
print *, 'difference: looks broken ', a-b(1)
! Test with really big value
b(:) = huge (1.0_k)
print *, 'huge value: ', b(1)
write (tmp, *) b
read (tmp, *) a, c
print *, "tmp=", tmp
print *, "Whats this about!!"
print *, a
print *, b(1)
print *, b(2)
print *, c
!if (a /= b(1)) call abort ()
!if (c /= b(2)) call abort ()
end program huge_real10_formatted

$ ./a.out
real(16) big value: 5.94865747678615882542880000000000000E+4931
same value read again: 5.94865747678615882542880000000000000E+4931
difference: looks broken 3.36685996541765098451450000000000000E+4907
huge value: +Infinity
tmp= +Infinity +Infinity
Whats this about!!
+Infinity
+Infinity
+Infinity
+Infinity

I will keep picking at this, but I think we need to leave the default
widths alone. Then for platforms using libquad, consider reduced width.
Also see why Huge is coming out Infinity. ???


Replacing isfinite with finiteq in write_float.def


 #define WRITE_FLOAT(x,y)\
 {\
 	GFC_REAL_ ## x tmp;\
 	tmp = * (GFC_REAL_ ## x *)source;\
 	sign_bit = __builtin_signbit (tmp);\
-	if (!isfinite (tmp))\
+	if (!finiteq (tmp))\
 	  { \
 	    write_infnan (dtp, f, isnan (tmp), sign_bit);\
 	    return;\

Correctly determines the finite-ness of the KIND=16 real in the test and the correct results are given. So we need to somehow define isfinite for real(KIND=16) values and invoke it here.

This is the last of my comments for now.

Summarizing:

For KIND=16 floats on systems using libquad

1. define MIN_FIELD_WIDTH 46

2. define isfinite function

Regards,

Jerry


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]