This is the mail archive of the
`cygwin`
mailing list for the Cygwin 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] |

*From*: Thomas Henlich <thenlich at users dot sourceforge dot net>*To*: cygwin at cygwin dot com*Date*: Mon, 7 Mar 2011 10:39:26 +0100*Subject*: 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.14285714285714284921269000000000 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.14285714285714284921269000000000 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

**Follow-Ups**:**Re: 1.7.8: Fortran I/O rounding inaccuracy***From:*marco atzeri

**Re: 1.7.8: Fortran I/O rounding inaccuracy***From:*Corinna Vinschen

**Re: 1.7.8: Fortran I/O rounding inaccuracy***From:*Roger K. Wells

Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|

Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |