Title
gcd and lcm should support a wider range of input values
Status
c++17
Section
[numeric.ops.gcd][numeric.ops.lcm]
Submitter
Marshall Clow

Created on 2016-12-16.00:00:00 last changed 87 months ago

Messages

Date: 2017-01-30.15:17:53

Proposed resolution:

This wording is relative to N4604.

  1. Edit [numeric.ops.gcd] as indicated:

    template<class M, class N>
      constexpr common_type_t<M, N> gcd(M m, N n);
    

    -2- Requires: |m| shall be representable as a value of type M and |n| shall be representable as a value of type N|m| and |n| shall be representable as a value of common_type_t<M, N>. [Note: These requirements ensure, for example, that gcd(m, m) = |m| is representable as a value of type M. — end note]

  2. Edit [numeric.ops.lcm] as indicated:

    template<class M, class N>
      constexpr common_type_t<M, N> lcm(M m, N n);
    

    -2- Requires: |m| shall be representable as a value of type M and |n| shall be representable as a value of type N|m| and |n| shall be representable as a value of common_type_t<M, N>. The least common multiple of |m| and |n| shall be representable as a value of type common_type_t<M, N>.

Date: 2017-01-27.00:00:00

[ 2017-01-27 Telecon ]

Priority 0

Date: 2016-12-16.00:00:00

This is a duplicate of 2792, which addressed LFTS 2.

By the current definition, gcd((int64_t)1234, (int32_t)-2147483648) is ill-formed (because 2147483648 is not representable as a value of int32_t.) We want to change this case to be well-formed. As long as both |m| and |n| are representable as values of the common type, absolute values can be calculate d without causing unspecified behavior, by converting m and n to the common type before taking the negation.

Suggested resolution:

|m| shall be representable as a value of type M and |n| shall be representable as a value of type N|m| and |n| shall be representable as a value of common_type_t<M, N>.

History
Date User Action Args
2017-07-30 20:15:43adminsetstatus: wp -> c++17
2017-03-05 23:41:16adminsetstatus: ready -> wp
2017-01-30 15:17:53adminsetmessages: + msg8812
2017-01-30 15:17:53adminsetstatus: new -> ready
2016-12-16 21:24:37adminsetmessages: + msg8757
2016-12-16 00:00:00admincreate