Document: WG14 N1355
Submitter: Fred Tydeman (USA)
Submission Date: 2009-02-06
Related WG14 documents: N1312
Subject: Preferred quantum exponent for DFP math
functions
IEEE-754-2008 has: 9.1 Conforming language- and implementation-defined functions:
Paragraph 1: As noted below, the specificaitons for inexact exceptions and preferred quantum in previous clauses do not apply to the functions specified in this clause.
Paragraph 3: A conforming function shall return results correctly rounded for the applicable rounding direction for all operands in its domain. The preferred quantum is language-defined.
9.2.1 Special Values has several pages of specific cases (mostly for transcendental functions); they list the values, but not the preferred qunatum exponent. For example, acos(1) is +0 and acosh(1) is +0.
WG14 N1312 (TR 24732) has: 8.2 Functions
Paragraph 1: The headers and library supply a number of functions and macros that implement support for decimal floating point data with the semantics specified in IEEE 754-2008, including producing results with the preferred exponent where appropriate.
That is followed by a list of algebraic functions; which is a subset of <math.h>. The ones that matter to this document are: sqrt, frexp, ldexp, scalb*, fabs, ceil, floor, round, trunc, rint.
So, neither defines the preferred quantum exponent for transcendental DFP math functions with special values.
Various implementors that I have talked with have done different things.
Jim Thomas (HP) implemented a preferred exponent of 0 for exact cases for transcendental functions. It's a simple rule to understand and implement. It avoids surprising output (like 0e-6144). It matches the conversion to decimal of the same binary value.
Our (Intel) prototype library currently uses the minimal exponent. Originally I used zero (effective, unbiased exponent), and I still slightly prefer that choice, since it is an exact result. But our testers preferred the minimal exponent, and since I didn't feel strongly either way I was happy to accommodate them. If there are several other voices in favour of zero I'll be very happy to change back again.
I (Tydeman) would expect one argument functions where f(zero) returns zero to have as its first line of code:
if( isnan(x) || (0.DF==x) ) return x;That is, the argument that comes in is the value returned. That would leave the preferred exponent alone.
IEEE-754-2008 has (on a related topic):
For exact conversions from binary to decimal formats, the preferred exponent is 0.Earlier drafts had the preferred exponent be the maximum, i.e. trailing zeros of exact results were to be shifted out -- and an exact result of zero would have the maximum possible exponent. Such a zero has the interesting property that it is neutral for addition.
So we have four choices mentioned:
zero exponent minimal exponent same exponent maximum exponent
This list of special cases are:
Functions covered by IEEE-754-2008 and the DFP TR:
f(x) returns x
zero
frexp
ldexp(0.,any)
scalbn(0.,any), scalbln(0.,any)
modf ???
sqrt
fabs
ceil
floor
nearbyint
rint
round
trunc
fmod(0.,non-zero) ???
non-zero
frexp(.1 <= x < 1.)
scalbn(non-zero,0), scalbln(non-zero,0L)
f(x) returns w
w=zero
fdim(x,y) when x <= y ????
Functions NOT covered by IEEE-754-2008 and the DFP TR:
f(x) returns x
zero
asin, sin
atan, tan
asinh, sinh
atanh, tanh
expm1
log1p
modf
cbrt
hypot(0.,0.)
erf
fmod(0.,non-zero)
non-zero
hypot(non-zero,0.)
pow(1.,any)
f(x) returns w
w=zero
acos(1.)
acosh(1.)
log(1.)
log10(1.)
log2(1.)
erfc(+inf)
lgamma(1.), lgamma(2.)
w=non-zero
cos(0.) is 1.
cosh(0.) is 1.
exp(0.) is 1.
exp2(0.) is 1.
log10(10**N) is N
log2(2**N) is N
pow(any,0.) is 1. [and others]
erf(+/-inf) is +/-1.
erfc(-inf) is 2.
tgamma(+N) is (N-1)!