This page is a snapshot from the LWG issues list, see the Library Active Issues List for more information and the meaning of New status.

### 3172. 3-arg `std::hypot` is underspecified compared to the 2-arg overload

Section: 28.7.3 [c.math.hypot3] Status: New Submitter: Matthias Kretz Opened: 2018-12-06 Last modified: 2018-12-21

Priority: 3

View all issues with New status.

Discussion:

The 2-arg `hypot` function specified in the C standard is required to avoid overflow and underflow (7.12.7.3 p2). Furthermore C's Annex F (IEC 60559 floating-point arithmetic) defines special cases for inputs of `±0` and `±inf` (F. 10.4.3). The 3-arg `hypot` function 28.7.3 [c.math.hypot3] is only specified as "Returns: x 2+ y 2+z 2.". This is inconsistent with the 2-arg overload.

It is not clear whether C's Annex F is "imported" into the C++ standard. [cmath.syn] p1 suggests that it is: "The contents and meaning of the header `<cmath>` are the same as the C standard library header `<math.h>`, […]".

[2018-12-21 Reflector prioritization]

Set Priority to 3

Proposed resolution:

This wording is relative to N4778.

> [Drafting Note: Two mutually exclusive options are prepared, depicted below by Option A and Option B, respectively.]

Option A

1. Modify 28.7.3 [c.math.hypot3] as indicated:

   > >     float hypot(float x, float y, float z);
   > >     double hypot(double x, double y, double z);
   > >     long double hypot(long double x, long double y, long double z);

   > > > -?- Effects: The `hypot` functions compute the square root of the sum of the squares of `x`, `y`, and `z`, without undue overflow or underflow. A range error may occur.

   > > > -1- Returns: x 2+ y 2+z 2.

   > > > -?- Remarks: If `__STDC_IEC_559__` is defined, the following guarantees hold:

   > > > - `hypot(x, y, z)`, `hypot(x, z, y)`, `hypot(z, y, x)`, and `hypot(x, y, -z)` are equivalent.

   > > > - if `y2 + z2 == ±0`, `hypot(x, y, z)` is equivalent to `fabs(x)`.

   > > > - `hypot(±∞, y, z)` returns `+∞`, even if `y` and/or `z` is a NaN.

Option B

1. Add a note that clarifies that the behavior of the 3-arg `hypot` function differs from the C specification. I.e. that no special guarantees wrt. over-/underflow or special values are given.