X-Recipient: archive-cygwin AT delorie DOT com X-SWARE-Spam-Status: No, hits=-1.3 required=5.0 tests=AWL,BAYES_05,DKIM_SIGNED,DKIM_VALID,FREEMAIL_FROM,RCVD_IN_DNSWL_LOW,T_TO_NO_BRKTS_FREEMAIL X-Spam-Check-By: sourceware.org MIME-Version: 1.0 Date: Mon, 7 Mar 2011 10:39:26 +0100 Message-ID: Subject: 1.7.8: Fortran I/O rounding inaccuracy From: Thomas Henlich To: cygwin AT cygwin DOT com Content-Type: text/plain; charset=ISO-8859-1 Mailing-List: contact cygwin-help AT cygwin DOT com; run by ezmlm List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: cygwin-owner AT cygwin DOT com Mail-Followup-To: cygwin AT cygwin DOT com Delivered-To: mailing list cygwin AT cygwin DOT com 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