Document: WG14 N1486


Submitter: Fred J. Tydeman (USA)
Submission Date: 2010-05-27
Related documents: N1466, N1429
Subject: fabs

Background: IEC 60559-1989 [IEEE-754-1985] has the following:

Some functions, such as the copy operation y := x without change of format, may at the implementor's option be treated as nonarithmetic operations which do not signal the invalid operation exception for signaling NaNs; the functions in question are (1), (2), (6), and (7).

1. Copysign(x, y) returns x with the sign of y. Hence, abs(x) = copysign(x, 1.0), even if x is NaN.

Since Annex F of C99 is a binding between C language and IEC 60559, the requirements of IEC 60559 apply. But, C99 did not do a good job of specifying some of those requirements.

C99 in F.10 Mathematics <math.h>, paragraph 11 has:

Functions with a NaN argument return a NaN result and raise no floating-point exception, except where stated otherwise.

C99 in F.10 Mathematics <math.h>, paragraph 13 has:

Recommended practice
If a function with one or more NaN arguments returns a NaN result, the result should be the same as one of the NaN arguments (after possible type conversion), except perhaps for the sign.

Hence, currently, C99 allows fabs(NaN) to:

  1. Return a different NaN
  2. Leave the sign bit set (negative)

I believe that the current C99 behaviour allowed conflicts with IEC 60559.

Add to F.3 after the copysign bullet:

-- The fabs functions in <math.h> provide the abs function recommended in the Appendix to IEC 60559.

Add to F.10.4.2 the fabs functions a new bullet:

-- fabs(NaN) returns the same NaN with its sign bit set to 0 (positive).

Add to Rationale:

In IEC 60559, fabs() is considered a bit operation that affects only the sign bit.