std::numeri...::is_modulo(3)
π std::numeric_limits::is_modulo(3) π
okay bestie, welcome to the C++ Standard Libary manual. todayβs main character is std::numeric_limits::is_modulo, and ngl itβs giving βtiny trait, big overflow opinions.β no cap. π
πΈ 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. wrap-around math, fr fr. π
is_modulo is false for signed integer types, unless the implementation defines signed integer overflow to wrap. that βunlessβ is doing a lot, bestie β lowkey obsessed with how much work one clause can do. π
π Standard specializations π
hereβs the full vibe check: T on the left, value of std::numeric_limits<T>::is_modulo on the right:
/* non-specialized */βfalseboolβfalsecharβ implementation-definedsigned charβ implementation-definedunsigned charβtruewchar_tβ implementation-definedchar8_t(since C++20) βtruechar16_t(since C++11) βtruechar32_t(since C++11) βtrueshortβ implementation-definedunsigned shortβtrueintβ implementation-definedunsigned intβtruelongβ implementation-definedunsigned longβtruelong long(C++11) β implementation-definedunsigned long long(C++11) βtruefloatβfalsedoubleβfalselong doubleβfalse
π Notes π
The standard said "On most machines, this is true for signed integers." before the resolution of LWG issue 2422. See GCC PR 22200 for a related discussion.
thatβs the whole note, bestie β historical lore and a GCC PR reference, iconic behavior. π«Ά
π» Example π»
Demonstrates the behavior of modulo types:
Thereβs a // Run this code marker in the original, so letβs 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_limits<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 retroactively to previously published C++ standards:
LWG 612β applied toC++98. Behavior as published: the definition of "handle overflows with modulo arithmetic" was poor^[1]. Correct behavior: provided a better definition.LWG 2422β applied toC++98. Behavior as published:is_modulowas required to betruefor signed integer types on most machines. Correct behavior: required to befalsefor signed integer types unless signed integer overflow is defined to wrap.
- β The definition is "adding two positive numbers can have a result 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).
π thatβs the whole page, bestie β source: http://cppreference.com, version/date: 2024.06.10, page: std::numeric_limits::is_modulo(3). byeee! π
π¦ where this page comes from
- nixpkgs unstable: stdman 2024.07.05
- opensuse-leap 16.0: stdman 2024.07.05-bp160.1.9 Β· MIT
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms