Title
Sufficient Additional Special Math Overloads
Status
new
Section
[cmath.syn]
Submitter
Casey Carter

Created on 2019-07-11.00:00:00, last changed 2019-07-11.00:00:00.

Messages

Date: 2019-07-12.17:56:59

The "sufficient additional overloads" wording in [cmath.syn] paragraph 2 does not apply to the special math functions, since they are not "overloaded functions". The lack of "sufficient additional overloads" doesn't agree with N3060 (the final draft of ISO/IEC 29124 which standardized the mathematical special functions) [sf.cmath] paragraphs 3 and 4:

-3- Each of the functions specified above that has one or more double parameters (the double version) shall have two additional overloads:

  1. a version with each double parameter replaced with a float parameter (the float version), and

  2. a version with each double parameter replaced with a long double parameter (the long double version).

The return type of each such float version shall be float, and the return type of each such long double version shall be long double.

-4- Moreover, each double version shall have sufficient additional overloads to determine which of the above three versions to actually call, by the following ordered set of rules:

  1. First, if any argument corresponding to a double parameter in the double version has type long double, the long double version is called.

  2. Otherwise, if any argument corresponding to a double parameter in the double version has type double or has an integer type, the double version is called.

  3. Otherwise, the float version is called.

P226R1 "Mathematical Special Functions for C++17" notably states: "At the level of and following [c.math], create a new subclause with heading and initial content the same as IS 29124:2010's clause [sf.cmath], 'Additions to header <cmath>,' renumbering as appropriate to the new context." which suggests the change between 29124 and C++17 was an oversight and not intentional.

Notably there is implementation divergence: MSVC implements precisely the wording in C++17, whereas libstdc++ provides additional overloads as specified in 29124, so they disagree e.g. on whether std::sph_neumann({}, {}) is well-formed.

History
Date User Action Args
2019-07-11 00:00:00admincreate