1.7.8: Fortran I/O rounding inaccuracy
Hi, I found the following bug in cygwin 1.7.8 on Windows XP: Fortran I/O rounding truncates the result after a certain number of digits. The following program: === write(*, '(f35.32)') 0.14285714285714285d0 end === gives this output: 0.142857142857142849212690 The expected output is: 0.14285714285714284921269268124888 This is in violation of the Fortran 2008 standard which demands: === 10.7.2.3.7 I/O rounding mode 2. In what follows, the term decimal value means the exact decimal number as given by the character string, while the term internal value means the number actually stored in the processor. For example, in dealing with the decimal constant 0.1, the decimal value is the mathematical quantity 1/10, which has no exact representation in binary form. Formatted output of real data involves conversion from an internal value to a decimal value; formatted input involves conversion from a decimal value to an internal value. 3. When the I/O rounding mode is UP, the value resulting from conversion shall be the smallest representable value that is greater than or equal to the original value. When the I/O rounding mode is DOWN, the value resulting from conversion shall be the largest representable value that is less than or equal to the original value. ... === Applied to the example this means, 0.14285714285714284921269268124888 is the largest representable (with 32 decimal digits) value that is less than the original value (binary 1.001001001001001001001001001001001001001001001001001 * 2^-3 = decimal 0.1428571428571428492126926812488818...), but 0.142857142857142849212690 is NOT. The problem seems limited to the Fortran language, because the C call printf(%35.32f\n, 0.14285714285714285) prints the expected result: 0.14285714285714284921269268124888 -- Problem reports: http://cygwin.com/problems.html FAQ: http://cygwin.com/faq/ Documentation: http://cygwin.com/docs.html Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple
Re: 1.7.8: Fortran I/O rounding inaccuracy
On Mon, Mar 7, 2011 at 10:39 AM, Thomas Henlich wrote: Hi, I found the following bug in cygwin 1.7.8 on Windows XP: Fortran I/O rounding truncates the result after a certain number of digits. The following program: === write(*, '(f35.32)') 0.14285714285714285d0 end === gives this output: 0.142857142857142849212690 The expected output is: 0.14285714285714284921269268124888 This is in violation of the Fortran 2008 standard which demands: I doubt our compiler is Fortran 2008 compliant, as at maximum it will be Fortran 2003 http://gcc.gnu.org/gcc-4.3/changes.html === 10.7.2.3.7 I/O rounding mode 2. In what follows, the term decimal value means the exact decimal number as given by the character string, while the term internal value means the number actually stored in the processor. For example, in dealing with the decimal constant 0.1, the decimal value is the mathematical quantity 1/10, which has no exact representation in binary form. Formatted output of real data involves conversion from an internal value to a decimal value; formatted input involves conversion from a decimal value to an internal value. 3. When the I/O rounding mode is UP, the value resulting from conversion shall be the smallest representable value that is greater than or equal to the original value. When the I/O rounding mode is DOWN, the value resulting from conversion shall be the largest representable value that is less than or equal to the original value. ... === Applied to the example this means, 0.14285714285714284921269268124888 is the largest representable (with 32 decimal digits) value that is less than the original value (binary 1.001001001001001001001001001001001001001001001001001 * 2^-3 = decimal 0.1428571428571428492126926812488818...), but 0.142857142857142849212690 is NOT. The problem seems limited to the Fortran language, because the C call printf(%35.32f\n, 0.14285714285714285) prints the expected result: 0.14285714285714284921269268124888 -- Problem reports: http://cygwin.com/problems.html FAQ: http://cygwin.com/faq/ Documentation: http://cygwin.com/docs.html Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple Have you tested gfortran 4.3 on other platform ? Marco -- Problem reports: http://cygwin.com/problems.html FAQ: http://cygwin.com/faq/ Documentation: http://cygwin.com/docs.html Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple
Re: 1.7.8: Fortran I/O rounding inaccuracy
On Mar 7 10:39, Thomas Henlich wrote: Hi, I found the following bug in cygwin 1.7.8 on Windows XP: Fortran I/O rounding truncates the result after a certain number of digits. The following program: === write(*, '(f35.32)') 0.14285714285714285d0 end === gives this output: 0.142857142857142849212690 The expected output is: 0.14285714285714284921269268124888 [...] The problem seems limited to the Fortran language, because the C call printf(%35.32f\n, 0.14285714285714285) prints the expected result: 0.14285714285714284921269268124888 So it's not a Cygwin bug after all. It's a bug in the GNU fortran compiler or one of its libraries. You should ask about this in a GNU fortran mailing list, perhaps. Corinna -- Corinna Vinschen Please, send mails regarding Cygwin to Cygwin Project Co-Leader cygwin AT cygwin DOT com Red Hat -- Problem reports: http://cygwin.com/problems.html FAQ: http://cygwin.com/faq/ Documentation: http://cygwin.com/docs.html Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple
Re: 1.7.8: Fortran I/O rounding inaccuracy
I doubt our compiler is Fortran 2008 compliant, as at maximum it will be Fortran 2003 An identical phrase appears in Fortran 2003. Have you tested gfortran 4.3 on other platform ? Due to unavailability, I was not able to test this particular version on other platforms. Tested ok: gfortran 4.4 on Debian gfortran snapshot 20101129 on mingw32 Bug confirmed: gfortran snapshot 20100408 (unofficial Cygwin build) -- Problem reports: http://cygwin.com/problems.html FAQ: http://cygwin.com/faq/ Documentation: http://cygwin.com/docs.html Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple
Re: 1.7.8: Fortran I/O rounding inaccuracy
On 3/7/2011 4:17 AM, Thomas Henlich wrote: I doubt our compiler is Fortran 2008 compliant, as at maximum it will be Fortran 2003 An identical phrase appears in Fortran 2003. Have you tested gfortran 4.3 on other platform ? Due to unavailability, I was not able to test this particular version on other platforms. Tested ok: gfortran 4.4 on Debian gfortran snapshot 20101129 on mingw32 Bug confirmed: gfortran snapshot 20100408 (unofficial Cygwin build) You haven't shown how you tested rounding modes UP or DOWN, which may not be implemented in gfortran, as those (I believe) require the IEEE_arithmetic module, which is still under development. Doesn't the wording you quote apply to the binary value resulting from READ conversion? In the default (without IEEE_arithmetic settings), it's not clear to me that f2003 or 2008 standards impose requirements beyond those of IEEE754, which allow the decimal representation to truncate after 17 correct digits. As Corinna said, the place to ask about progress in this area of gfortran is fort...@gcc.org. Corinna is more of an expert on newlib than are we; the differences you quote between linux implementation on glibc and cygwin which you quote appear to be within newlib. -- Tim Prince -- Problem reports: http://cygwin.com/problems.html FAQ: http://cygwin.com/faq/ Documentation: http://cygwin.com/docs.html Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple
Re: 1.7.8: Fortran I/O rounding inaccuracy
On 03/07/2011 04:39 AM, Thomas Henlich wrote: Hi, I found the following bug in cygwin 1.7.8 on Windows XP: Fortran I/O rounding truncates the result after a certain number of digits. The following program: === write(*, '(f35.32)') 0.14285714285714285d0 end === gives this output: 0.142857142857142849212690 The expected output is: 0.14285714285714284921269268124888 This is in violation of the Fortran 2008 standard which demands: === 10.7.2.3.7 I/O rounding mode 2. In what follows, the term decimal value means the exact decimal number as given by the character string, while the term internal value means the number actually stored in the processor. For example, in dealing with the decimal constant 0.1, the decimal value is the mathematical quantity 1/10, which has no exact representation in binary form. Formatted output of real data involves conversion from an internal value to a decimal value; formatted input involves conversion from a decimal value to an internal value. 3. When the I/O rounding mode is UP, the value resulting from conversion shall be the smallest representable value that is greater than or equal to the original value. When the I/O rounding mode is DOWN, the value resulting from conversion shall be the largest representable value that is less than or equal to the original value. ... === Applied to the example this means, 0.14285714285714284921269268124888 is the largest representable (with 32 decimal digits) value that is less than the original value (binary 1.001001001001001001001001001001001001001001001001001 * 2^-3 = decimal 0.1428571428571428492126926812488818...), but 0.142857142857142849212690 is NOT. The problem seems limited to the Fortran language, because the C call printf(%35.32f\n, 0.14285714285714285) prints the expected result: 0.14285714285714284921269268124888 -- Problem reports: http://cygwin.com/problems.html FAQ: http://cygwin.com/faq/ Documentation: http://cygwin.com/docs.html Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple uname -a: CYGWIN_NT-6.1 rwells-w7 1.7.8(0.236/5/3) 2011-03-01 09:36 i686 Cygwin round.f: program round write(*,'(f35.32)') 0.14285714285714285d0 end output: 0.14285714285714284921269268124888 did I miss something? HTH, roger wells -- Roger Wells, P.E. SAIC 221 Third St Newport, RI 02840 401-847-4210 (voice) 401-849-1585 (fax) roger.k.we...@saic.com -- Problem reports: http://cygwin.com/problems.html FAQ: http://cygwin.com/faq/ Documentation: http://cygwin.com/docs.html Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple
Re: 1.7.8: Fortran I/O rounding inaccuracy
On 03/07/2011 10:44 AM, Roger K. Wells wrote: On 03/07/2011 04:39 AM, Thomas Henlich wrote: Hi, I found the following bug in cygwin 1.7.8 on Windows XP: Fortran I/O rounding truncates the result after a certain number of digits. The following program: === write(*, '(f35.32)') 0.14285714285714285d0 end === gives this output: 0.142857142857142849212690 The expected output is: 0.14285714285714284921269268124888 This is in violation of the Fortran 2008 standard which demands: === 10.7.2.3.7 I/O rounding mode 2. In what follows, the term decimal value means the exact decimal number as given by the character string, while the term internal value means the number actually stored in the processor. For example, in dealing with the decimal constant 0.1, the decimal value is the mathematical quantity 1/10, which has no exact representation in binary form. Formatted output of real data involves conversion from an internal value to a decimal value; formatted input involves conversion from a decimal value to an internal value. 3. When the I/O rounding mode is UP, the value resulting from conversion shall be the smallest representable value that is greater than or equal to the original value. When the I/O rounding mode is DOWN, the value resulting from conversion shall be the largest representable value that is less than or equal to the original value. ... === Applied to the example this means, 0.14285714285714284921269268124888 is the largest representable (with 32 decimal digits) value that is less than the original value (binary 1.001001001001001001001001001001001001001001001001001 * 2^-3 = decimal 0.1428571428571428492126926812488818...), but 0.142857142857142849212690 is NOT. The problem seems limited to the Fortran language, because the C call printf(%35.32f\n, 0.14285714285714285) prints the expected result: 0.14285714285714284921269268124888 -- Problem reports: http://cygwin.com/problems.html FAQ: http://cygwin.com/faq/ Documentation: http://cygwin.com/docs.html Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple uname -a: CYGWIN_NT-6.1 rwells-w7 1.7.8(0.236/5/3) 2011-03-01 09:36 i686 Cygwin round.f: program round write(*,'(f35.32)') 0.14285714285714285d0 end output: 0.14285714285714284921269268124888 did I miss something? answer to my own question: yes if compiling with g77 output: 0.14285714285714284921269268124888 if compiling with gfortran: output: 0.142857142857142849212690 a bit of a surprise. rkw HTH, roger wells -- Roger Wells, P.E. SAIC 221 Third St Newport, RI 02840 401-847-4210 (voice) 401-849-1585 (fax) roger.k.we...@saic.com -- Problem reports: http://cygwin.com/problems.html FAQ: http://cygwin.com/faq/ Documentation: http://cygwin.com/docs.html Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple
Re: 1.7.8: Fortran I/O rounding inaccuracy
Roger K. Wells ROGER.K.WELLS at saic.com writes: On 03/07/2011 10:44 AM, Roger K. Wells wrote: On 03/07/2011 04:39 AM, Thomas Henlich wrote: Hi, I found the following bug in cygwin 1.7.8 on Windows XP: Fortran I/O rounding truncates the result after a certain number of digits. The following program: === write(*, '(f35.32)') 0.14285714285714285d0 end === gives this output: 0.142857142857142849212690 The expected output is: 0.14285714285714284921269268124888 I don't think this has anything to do with cygin. On our linux system I get With Intel ifort: 0.14285714285714284921269268124888 With gfortran 4.1.2s544 0.1428571428571428492126927000 -- Problem reports: http://cygwin.com/problems.html FAQ: http://cygwin.com/faq/ Documentation: http://cygwin.com/docs.html Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple
Re: 1.7.8: Fortran I/O rounding inaccuracy
On 03/07/2011 12:15 PM, Peter Brown wrote: Roger K. WellsROGER.K.WELLSat saic.com writes: On 03/07/2011 10:44 AM, Roger K. Wells wrote: On 03/07/2011 04:39 AM, Thomas Henlich wrote: Hi, I found the following bug in cygwin 1.7.8 on Windows XP: Fortran I/O rounding truncates the result after a certain number of digits. The following program: === write(*, '(f35.32)') 0.14285714285714285d0 end === gives this output: 0.142857142857142849212690 The expected output is: 0.14285714285714284921269268124888 I don't think this has anything to do with cygin. On our linux system I get With Intel ifort: 0.14285714285714284921269268124888 With gfortran 4.1.2s544 0.1428571428571428492126927000 I agree. It's a GCC problem. I get the same results on Cygwin Linux: compiling with g77 gives correct output compiling with gfortran does not. rkw -- Problem reports: http://cygwin.com/problems.html FAQ: http://cygwin.com/faq/ Documentation: http://cygwin.com/docs.html Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple -- Roger Wells, P.E. SAIC 221 Third St Newport, RI 02840 401-847-4210 (voice) 401-849-1585 (fax) roger.k.we...@saic.com -- Problem reports: http://cygwin.com/problems.html FAQ: http://cygwin.com/faq/ Documentation: http://cygwin.com/docs.html Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple