11-174r1
To: J3
From: John Reid and Thomas Henlich and Malcolm Cohen
Subject: Interp: G editing for reals
Date: 2011 June 29
---------------------------------------------------------------------
NUMBER: F08/0055
TITLE: G editing for reals
KEYWORDS: format, G editing
DEFECT TYPE: Erratum
STATUS: J3 consideration in progress
QUESTION:
Q1. Gw.d editing for a real value that is in the range (0.1,10**d) and
is not near an integer power of 10 uses F editing to produce
exactly a value with d significant digits. For values in this
range that are near an integer power of 10, is it intended that F
editing be used to produce a value with d significant digits?
The rules in 10.7.5.2.2 usually have this effect, but the following
examples illustrate exceptions for rounding UP and to ZERO.
print "(ru,g11.2)", -9.95
print "(rz,g11.2)", -9.95
When rounded to two significant digits these are both equal to -9.9,
however following through the rules in the standard it says to use
F7.0 format which will give the result -9. (only one significant
digit). For positive values, rounding DOWN and to ZERO
print "(rd,g11.2)", 9.95
print "(rz,g11.2)", 9.95
both give the result 9.9 according to the rules in the standard.
Q2. Is Gw.d editing intended to use F editing when that produces d
significant digits?
It usually achieves this, but for
print "(ru,0p,g11.2)", -99.5
the standard requires 0PE11.2 editing to be used, which gives
-0.99E+02
even though F7.2 editing can represent it as -99.
Similarly for
print "(ru,0p,g11.2)", 99.
the standard requires 0PE11.2 editing to be used, which gives
0.99E+02, even though it is representable in F7.2 format as 99.
Q3. COMPATIBLE and NEAREST modes of rounding differ only when the two
nearest representable values are equidistant from the given
value. The similarity appears not to be represented in the second
table. What is meant by "if the higher value is even"?
If by "even" we mean the last digit is even, then since we are talking
about a mantissa which is close to 10, COMPATIBLE and NEAREST would
have the same effect.
Q4. The table has no entry for PROCESSOR_DEFINED rounding; since there
is no value specified for r, it is impossible to interpret the
table, which seems to indicate that it would not be standard
conforming to use G editing with PROCESSOR_DEFINED. How does the
PROCESSOR_DEFINED I/O rounding mode affect G editing?
Q5. According to 10.7.2.3.7 paragraphs 3 and 4, the effect of NEAREST
is processor dependent unless IEEE rounding on conversions is
supported. How does this affect G editing?
Q6. Consider
PRINT '(5(1X,1PG9.0))', 0.0, 0.04, 0.06, 0.4, 0.6
noting that these values are strictly monotonic increasing.
The standard appears to say that the output should be
0.E+00 4.E-02 0. 0. 6.E-01
which is decidedly not monotonic increasing.
Is this intentional?
ANSWER:
A1. Yes, it is intended to produce output with d significant digits.
The pseudo-table that gives the values for r is incorrect. An
edit is provided to correct these values.
A2. Yes. This is solved by the same edit. The value 1 is not
correct for r because that effectively turns an integer into the
next higher integer - this is not what rounding is supposed to do!
A3. This question is rendered moot by the same edit.
A4. The value of r in this case is processor dependent.
An edit is supplied.
A5. Unfortunately, because this is processor dependent, it is not
possible to describe the value of r in the standard.
An edit is supplied.
A6. Yes. This misleading output is compatible with Fortran 90
(but not with FORTRAN 77).
ALTERNATIVE ANSWER:
A1. Yes, it is intended to produce output with d significant digits.
The algorithm for choosing the output form for some I/O rounding
modes is defective. An edit is provided to replace this
algorithm.
A2. Yes. This is solved by the same edit.
A3. This question is rendered moot by the same edit.
A4. This question is rendered moot by the same edit.
A5. This question is rendered moot by the same edit.
A6. No. An edit is supplied to fix this.
EDITS to 10-007r1:
[24:11+] In 1.6.2, insert new paragraph following paragraph 1:
"The form produced by the G edit descriptor for some values and some
I/O rounding modes differs from that specified by Fortran 2003."
[258:between 20 and 21]
Replace the values for r in the table as follows:
COMPATIBLE unchanged
NEAREST change to "processor dependent"
UP change to "1-$\epsilon$ if the internal value is positive
0 if the internal value is negative"
DOWN change to "0 if the internal value is positive
1-\$epsilon$ if the internal value is negative"
ZERO change to "0"
add a new line to the table
"PROCESSOR_DEFINED processor dependent"
and append sentence fragment after the table
"where $\epsilon$ is a number smaller than the smallest possible
difference between machine numbers".
ALTERNATIVE EDITS:
[24:11+] In 1.6.2, insert new paragraph following paragraph 1:
"The form produced by the G edit descriptor for some values and some
I/O rounding modes differs from that specified by Fortran 2003."
[24:27+] In 1.6.3, append new bullet item
"- The form produced by the G edit descriptor with d==0 differs from
that specified by Fortran 95 for some values.".
[25:6] In 1.6.4, replace the last full stop with semicolon and insert
new bullet item
"- the G edit descriptor with d==0 for some values.".
[258:14-]
Insert new paragraph
"If \si{d} is zero, \si{k}PE\si{w}.0 or \si{k}PE\si{w}.0E\si{e}
editing is used for G\si{w}.0 editing or G\si{w}.0E\si{e} editing
respectively."
{Without the italics markup, this is
"If d is zero, kPEw.0 or kPEw.0Ee editing is used for Gw.0 editing
or Gw.0Ee editing respectively."}
[258:15-19]
Replace the second and subsequent sentences of paragraph 4 including
the two internal pseudo-tables by
"Let \it{N} be the decimal value resulting from the conversion of
the internal value to decimal and its subsequent rounding to \si{d}
significant digits according to the I/O rounding mode, and let
\it{s} be the decimal exponent value of \it{N}, or 1 if \it{N} is
equal to zero. If 0<=\it{s}<=\si{d},
F(\si{w}-\it{n}).(\si{d}-\it{s}),n('b') editing is used where
\it{n} is 4 for G\si{w}.\si{d} editing and \si{e}+2 for
G\si{w}.\si{d}E\si{e} editing. If \it{s}<0 or \it{s}>d,
\si{k}PE\si{w}.\si{d} or \si{k}PE\si{w}.\si{d}E\si{e} editing is
used for G\si{w}.\si{d} editing or G\si{w}.\si{d}E\si{e} editing
respectively."
{Note: \it{something} is something in italics,
\si{something} is a syntax term (in italics).
Without the italics markup, this is
"Let N be the decimal value resulting from the conversion of the
internal value to decimal and its subsequent rounding to d
significant digits according to the I/O rounding mode, and let
s be the decimal exponent value of N, or 1 if N is equal to zero.
If 0<=s<=d, F(w-n).(d-s),n('b') editing is used where n is 4 for
Gw.d editing and e+2 for Gw.dEe editing. If s<0 or s>d, kPEw.d or
kPEw.dEe editing is used for Gw.d editing or Gw.dEe editing
respectively."}
SUBMITTED BY: John Reid and Thomas Henlich
HISTORY: 11-174 m195 Submitted
11-174r1 Revised answer.
------------------------------------------------------------------------