*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:*
$\sqrt{{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**

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:* $\sqrt{{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 `y`^{2} + z^{2} == ±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**

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.