3234. Sufficient Additional Special Math Overloads

Section: 29.7.1 [cmath.syn] Status: Resolved Submitter: Casey Carter Opened: 2019-07-11 Last modified: 2023-02-07

Priority: 3

View other active issues in [cmath.syn].

View all other issues in [cmath.syn].

View all issues with Resolved status.

Discussion:

The "sufficient additional overloads" wording in 29.7.1 [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.

[2020-04-07 Issue Prioritization]

Priority to 3 after reflector discussion.

[2023-02-07 Status changed: New → Resolved.]

Resolved by the application of P1467R9. It's now clear that the special functions should have "sufficient additional overloads".

Proposed resolution: