Common mathematical functions | |||||||||||||||||||||||||||||||
Mathematical special functions(C++17) | |||||||||||||||||||||||||||||||
Mathematical constants(C++20) | |||||||||||||||||||||||||||||||
Basic linear algebra algorithms(C++26) | |||||||||||||||||||||||||||||||
Data-parallel types (SIMD)(C++26) | |||||||||||||||||||||||||||||||
Floating-point environment(C++11) | |||||||||||||||||||||||||||||||
Complex numbers | |||||||||||||||||||||||||||||||
Numeric array (valarray ) | |||||||||||||||||||||||||||||||
Pseudo-random number generation | |||||||||||||||||||||||||||||||
Bit manipulation(C++20) | |||||||||||||||||||||||||||||||
Saturation arithmetic(C++26) | |||||||||||||||||||||||||||||||
Factor operations | |||||||||||||||||||||||||||||||
|
| ||||||||||||||||||||||||||||||
Interpolations | |||||||||||||||||||||||||||||||
|
| ||||||||||||||||||||||||||||||
Generic numeric operations | |||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||
C-style checked integer arithmetic | |||||||||||||||||||||||||||||||
|
Functions | ||||||||||||||||
Basic operations | ||||||||||||||||
| ||||||||||||||||
Exponential functions | ||||||||||||||||
Power functions | ||||||||||||||||
Trigonometric and hyperbolic functions | ||||||||||||||||
Error and gamma functions | ||||||||||||||||
Nearest integer floating point operations | |||||||||||||||||||||||||||||||||||||||||
|
| ||||||||||||||||||||||||||||||||||||||||
Floating point manipulation functions | |||||||||||||||||||||||||||||||||||||||||
|
| ||||||||||||||||||||||||||||||||||||||||
Classification and comparison | |||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||
Types | |||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||
Macro constants | |||||||||||||||||||||||||||||||||||||||||
|
|
Defined in header <cstdlib> | ||
std::div_t div(int x,int y); | (1) | (constexpr since C++23) |
std::ldiv_t div(long x,long y); | (2) | (constexpr since C++23) |
std::lldiv_t div(longlong x,longlong y); | (3) | (since C++11) (constexpr since C++23) |
std::ldiv_t ldiv(long x,long y); | (4) | (constexpr since C++23) |
std::lldiv_t lldiv(longlong x,longlong y); | (5) | (since C++11) (constexpr since C++23) |
Defined in header <cinttypes> | ||
std::imaxdiv_t div(std::intmax_t x,std::intmax_t y); | (6) | (since C++11) (constexpr since C++23) |
std::imaxdiv_t imaxdiv(std::intmax_t x,std::intmax_t y); | (7) | (since C++11) (constexpr since C++23) |
Computes both the quotient and the remainder of the division of the numeratorx by the denominatory.
6,7) Overload of std::div forstd::intmax_t is provided in<cinttypes> if and only ifstd::intmax_t is anextended integer type. | (since C++11) |
The quotient is the algebraic quotient with any fractional part discarded (truncated towards zero). The remainder is such thatquot* y+ rem== x. | (until C++11) |
The quotient is the result of the expressionx/ y. The remainder is the result of the expressionx% y. | (since C++11) |
Contents |
x, y | - | integer values |
If both the remainder and the quotient can be represented as objects of the corresponding type (int,long,longlong,std::intmax_t, respectively), returns both as an object of typestd::div_t
,std::ldiv_t
,std::lldiv_t
,std::imaxdiv_t
defined as follows:
struct div_t{int quot;int rem;};
or
struct div_t{int rem;int quot;};
struct ldiv_t{long quot;long rem;};
or
struct ldiv_t{long rem;long quot;};
struct lldiv_t{longlong quot;longlong rem;};
or
struct lldiv_t{longlong rem;longlong quot;};
struct imaxdiv_t{std::intmax_t quot;std::intmax_t rem;};
or
struct imaxdiv_t{std::intmax_t rem;std::intmax_t quot;};
If either the remainder or the quotient cannot be represented, the behavior is undefined.
UntilCWG issue 614 was resolved (N2757), the rounding direction of the quotient and the sign of the remainder in thebuilt-in division and remainder operators was implementation-defined if either of the operands was negative, but it was well-defined instd::div
.
On many platforms, a single CPU instruction obtains both the quotient and the remainder, and this function may leverage that, although compilers are generally able to merge nearby/
and%
where suitable.
#include <cassert>#include <cmath>#include <cstdlib>#include <iostream>#include <sstream>#include <string> std::string division_with_remainder_string(int dividend,int divisor){auto dv= std::div(dividend, divisor);assert(dividend== divisor* dv.quot+ dv.rem);assert(dv.quot== dividend/ divisor);assert(dv.rem== dividend% divisor); auto sign=[](int n){return n>0?1: n<0?-1:0;};assert((dv.rem==0) or(sign(dv.rem)== sign(dividend))); return(std::ostringstream()<<std::showpos<< dividend<<" = "<< divisor<<" * ("<< dv.quot<<") "<<std::showpos<< dv.rem).str();} std::string itoa(int n,int radix/*[2..16]*/){std::string buf; std::div_t dv{}; dv.quot= n; do{ dv= std::div(dv.quot, radix); buf+="0123456789abcdef"[std::abs(dv.rem)];// string literals are arrays}while(dv.quot); if(n<0) buf+='-'; return{buf.rbegin(), buf.rend()};} int main(){std::cout<< division_with_remainder_string(369,10)<<'\n'<< division_with_remainder_string(369,-10)<<'\n'<< division_with_remainder_string(-369,10)<<'\n'<< division_with_remainder_string(-369,-10)<<"\n\n"; std::cout<< itoa(12345,10)<<'\n'<< itoa(-12345,10)<<'\n'<< itoa(42,2)<<'\n'<< itoa(65535,16)<<'\n';}
Output:
+369 = +10 * (+36) +9+369 = -10 * (-36) +9-369 = +10 * (-36) -9-369 = -10 * (+36) -9 12345-12345101010ffff
(C++11)(C++11) | remainder of the floating point division operation (function)[edit] |
(C++11)(C++11)(C++11) | signed remainder of the division operation (function)[edit] |
(C++11)(C++11)(C++11) | signed remainder as well as the three last bits of the division operation (function)[edit] |
C documentation fordiv |
1. | Euclidean division — From Wikipedia. |
2. | Modulo (and Truncated division) — From Wikipedia. |