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 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 differs from the expected value by a multiple of max() - min() + 1. is_modulo is false for signed integer types, unless the implementa- tion 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 (since C++20) true char16_t (since C++11) true char32_t (since 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 The standard said "On most machines, this is true for signed inte- gers." before the resolution of LWG issue 2422. See GCC PR 22200 for a related discus- sion. 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 << "max 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>(); std::cout << '\n'; 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 the definition of "handle LWG 612 C++98 overflows provided a with modulo arithmetic" was better definition poor^[1] is_modulo was required to be required to be false for signed LWG 2422 C++98 true for integer types signed integer types on most unless signed inte- ger overflow is machines defined to wrap 1. The definition is "adding two positive numbers can have a re- sult that wraps around to a third number that is less". It has the following problems: * It does not define the wrapped value. * It does not state whether result is repeatable. * It does not require that doing addition, subtraction and other operations on all values have defined behavior. 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 2024.06.10 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.1.quarterly>
