FreeBSD Manual Pages
std::numeri...::is_modulo(3) C++ Standard Libary std::numeri...::is_modulo(3) NAME std::numeric_limits::is_modulo - std::numeric_limits::is_modulo Synopsis static const bool is_modulo; (until C++11) static constexpr bool is_modulo; (since C++11) The value of std::numeric_limits<T>::is_modulo is true for all arithmetic types T that are possible to (until C++11)handle overflows with modulo arithmetic, that is, if the result of addition, subtraction, multiplication, or division of this type would fall outside the range [min(), max()], the value returned by such operation dif- fers from the expected value by a multiple of max()-min()+1. is_modulo is false for signed integer types, unless the implementa- tion (since C++11) defines signed integer overflow to wrap. Standard specializations T value of std::numeric_limits<T>::is_mod- ulo /* non-specialized */ false bool false char implementation-defined signed char implementation-defined unsigned char true wchar_t implementation-defined char8_t (C++20) true char16_t (C++11) true char32_t (C++11) true short implementation-defined unsigned short true int implementation-defined unsigned int true long implementation-defined unsigned long true long long (C++11) implementation-defined unsigned long long (C++11) true float false double false long double false Notes Although the C++11 standard still says "On most machines, this is true for signed integers.", it is a defect and has been corrected. The exact wording changed from C++03 to C++11 in such a way that the true value is no longer com- patible with undefined behavior on signed integer overflow. Because of that, the implementations that rely on signed overflow being undefined (for optimization op- portunities) now set is_modulo to false for signed integers. See for example GCC PR 22200. Example Demonstrates the behavior of modulo types // Run this code #include <iostream> #include <type_traits> #include <limits> template<class T> typename std::enable_if<std::numeric_limits<T>::is_modulo>::type check_overflow() { std::cout << "\nmax value is " << std::numeric_limits<T>::max() << '\n' << "min value is " << std::numeric_limits<T>::min() << '\n' << "max value + 1 is " << std::numeric_lim- its<T>::max()+1 << '\n'; } int main() { check_overflow<int>(); check_overflow<unsigned long>(); // check_overflow<float>(); // compile-time error, not a modulo type } Possible output: max value is 2147483647 min value is -2147483648 max value + 1 is -2147483648 max value is 18446744073709551615 min value is 0 max value + 1 is 0 Defect reports The following behavior-changing defect reports were applied retroac- tively to previously published C++ standards. DR Applied to Behavior as published Correct behavior is_modulo was required to true required to be false for signed LWG 2422 C++11 for signed integer types on integer types most machines unless signed in- teger overflow is defined to wrap See also is_integer identifies integer types [static] (public static member constant) is_iec559 identifies the IEC 559/IEEE 754 floating-point types [static] (public static member constant) is_exact identifies exact types [static] (public static member constant) http://cppreference.com 2022.07.31 std::numeri...::is_modulo(3)
NAME | Synopsis | Standard specializations | Notes | Example | Possible output: | See also
Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=std::numeric_limits::is_modulo&sektion=3&manpath=FreeBSD+Ports+15.0>
