std::hypot
is underspecified compared to the 2-arg overloadSection: 29.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
29.7.3 [c.math.hypot3] is only specified as "Returns:
.". This is
inconsistent with the 2-arg overload.
<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 29.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
-1- Returns: . -?- Remarks: Ifhypot
functions compute the square root of the sum of the squares ofx
,y
, andz
, without undue overflow or underflow. A range error may occur.__STDC_IEC_559__
is defined, the following guarantees hold:
hypot(x, y, z)
,hypot(x, z, y)
,hypot(z, y, x)
, andhypot(x, y, -z)
are equivalent.if
y2 + z2 == ±0
,hypot(x, y, z)
is equivalent tofabs(x)
.
hypot(±∞, y, z)
returns+∞
, even ify
and/orz
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.