From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 18850 invoked by alias); 24 Jan 2008 14:02:04 -0000 Received: (qmail 18658 invoked by uid 48); 24 Jan 2008 14:01:15 -0000 Date: Thu, 24 Jan 2008 15:09:00 -0000 Message-ID: <20080124140115.18657.qmail@sourceware.org> X-Bugzilla-Reason: CC References: Subject: [Bug libfortran/24685] real(16) formatted input is broken for huge values (gfortran.dg/default_format_2.f90) In-Reply-To: Reply-To: gcc-bugzilla@gcc.gnu.org To: gcc-bugs@gcc.gnu.org From: "dominiq at lps dot ens dot fr" Mailing-List: contact gcc-bugs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-bugs-owner@gcc.gnu.org X-SW-Source: 2008-01/txt/msg02883.txt.bz2 ------- 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