## Defect Report #299

Previous Defect Report < - > Next Defect Report

**Submitter:** Fred Tydeman (USA)

**Submission Date:** 2004-08-13

**Source:** WG 14

**Reference Document:**

**Version:** 1.2

**Date:** 2006-04-04

**Subject:** Is `cabs()` a type-generic
macro?

**Summary**

The standard is not clear as to which type-generic macro(s)
should be used to compute the absolute value of real, complex,
and imaginary types.

**Details**

Here are two viewpoints.

1) `cabs()` is not a type-generic macro.
Instead `fabs()` covers `fabsf()`,
`fabs()`, `fabsl()`,
`cabsf()`, `cabs()`, and
`cabsl()`.

If this viewpoint is correct, then 7.22p2 may need to be
updated along the lines of "except `modf` and
`cabs`". Also, in 7.22p7 (3rd line from end),
`cabs(fc)` should be changed to
`fabs(fc)`.

2) `cabs()` is a type-generic macro (but only
for complex arguments). That is `cabs()` covers
`cabsf()`, `cabs()`, and
`cabsl()`. In addition, `fabs()`
covers `fabsf()`, `fabs()`,
`fabsl()`, `cabsf()`,
`cabs()`, and `cabsl()`.

If this viewpoint is correct, then 7.22p6 needs to be
updated with `cabs`. Also, B.21 needs to have
`cabs` added to it.

It seems clear that `cabs()` is not a
type-generic macro.

In addition, it is not clear what `modf` is in
7.22p5.

**Suggested Technical Corrigendum**

7.22p5 Add ", except `modf`" after
"`<math.h>`"

7.22p7 (3rd line from end), `cabs(fc)` should
be changed to `fabs(fc)`.

**Committee Discussion**

7.22p2 says that every function in
`<math.h>` and
`<complex.h>` without an `l`
or `f` suffix has a corresponding type-generic
macro. Except `modf`.

However, 7.22p2 says nothing about what the macro is
*called*.

7.22p4 says that if there is a function F() in
`<math.h>` and a corresponding function
cF() in `<complex.h>`, then the TG-macro
for both F() and cF() is called "F". In addition, the TG-macro
for both `fabs()` and `cabs()` is
called "`fabs`".

7.22p5 and 7.22p6 say that for all remaining functions that
have TG-macros, the macro has the same name as the
function.

However, none of 7.22p4 to 7.22p6 say which functions have
TG-macros.

Adding "except `cabs`" to 7.22p2 would
directly contradict 7.22p4, because it says that there is
*no* TG-macro corresponding to `cabs` (and,
therefore, `fabs`).

If there's a defect in the wording, it's that 7.22p5 should
say "except modf" after "`<math.h>`". Or
all of 7.22p4 to 7.22p6 should have something like "Where a
function has a corresponding type-generic macro" inserted in
them. But we don't even believe that is necessary.

To get the absolute value of a `float complex`
using a type-generic macro, use `fabs`.
Therefore, 7.22p7 (3rd line from end) needs to change
`cabs(fc)` to `fabs(fc)`.

As G.7p1 correctly shows, to take the absolute value of an
imaginary type, use `fabs`.

**Technical Corrigendum**

7.22p5 Add ", except `modf`" after
"`<math.h>`"

7.22p7 (3rd line from end), `cabs(fc)` should
be changed to `fabs(fc)`.

Previous Defect Report < - > Next Defect Report