------- Comment #28 from dominiq at lps dot ens dot fr 2008-01-24 14:01 ------- Some remarks from powerpc-apple-darwin9:
(1) the title is misleading: formatted inputs are not broken, formatted outputs are. (2) they seem broken for constants nearest from bellow any power of two, as shown by the following code: [karma] bug/real16% cat real_16_red.f90 real(16) :: x x = 1.0_16 print *, nearest(x,-x), nearest(x,x) print *, nearest(1.0_16,-1.0_16), nearest(1.0_16,1.0_16) end [karma] bug/real16% gfc -fno-range-check real_16_red.f90 [karma] bug/real16% a.out 0.99999999999999999999999999999998767 1.0000000000000000000000000000000247 1.00000000000000000000000000000000000 1.00000000000000000000000000000002465 where nearest(1.0_16,-1.0_16) is ouput as 1.0...0 and not as 0.9...98767. (3) As huge(1.0_16) is treated as a constant, I had to pay hide-and-seek with gfortran in the following code: [karma] bug/real16% cat huge_16.f90 character(80) :: tmp real(16) :: x, y x = 2.0_16**1022 print *, 2.0_16*x, 2.0_16*x-huge(x) ! 2.0_16**1023 is larger than huge(x) but not printed as +Inf y = nearest(4.0_16*x,-x) print *, 4.0_16*x, nearest(2.0_16*x,x), nearest(y,-x) x = nearest(2.0_16*x,-x) ! hide huge in a variable print *, x, x-huge(x) write(tmp,*) x read(tmp,*) y print *, x, y, x-y ! the printed value of y is not the same the one for x x = nearest(x,1.0_16) print *, x, nearest(x,1.0_16) print *, 8.98846567431157953864652595394512367E+0307_16 end [karma] bug/real16% gfc -fno-range-check huge_16.f90 [karma] bug/real16% a.out 8.98846567431157953864652595394512367E+0307 1.10791393256022264271830208461724263E+0276 +Infinity 8.98846567431157953864652595394534525E+0307 +Infinity 8.98846567431157953864652595394501288E+0307 0.0000000000000000000000000000000000 8.98846567431157953864652595394501288E+0307 8.98846567431157953864652595394512367E+0307 0.0000000000000000000000000000000000 8.98846567431157953864652595394512367E+0307 8.98846567431157953864652595394534525E+0307 +Infinity where x is an hidden huge(x), correctly printed as 8.98846567431157953864652595394501288E+0307, correctly read as y (x-y==0.0), while y is printed as 8.98846567431157953864652595394534525E+0307==+Inf. Note also several value above huge(x) not printed as +Inf. -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=24685