Movatterモバイル変換


[0]ホーム

URL:


cppreference.com
Namespaces
Variants
    Actions

      std::div,std::ldiv,std::lldiv,std::imaxdiv

      From cppreference.com
      <cpp‎ |numeric‎ |math
       
       
       
      Common mathematical functions
      Nearest integer floating point operations
      (C++11)(C++11)(C++11)
      (C++11)
      (C++11)
      (C++11)(C++11)(C++11)
      Floating point manipulation functions
      (C++11)(C++11)
      (C++11)
      (C++11)
      Classification and comparison
      (C++11)
      (C++11)
      (C++11)
      (C++11)
      (C++11)
      (C++11)
      Types
      div_t
      ldiv_t
      lldiv_t
      (C++11)
      imaxdiv_t
      (C++11)
      (C++11)
      (C++11)
      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 ofstd::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

      [edit]Parameters

      x, y - integer values

      [edit]Return value

      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:

      std::div_t

      struct div_t{int quot;int rem;};

      or

      struct div_t{int rem;int quot;};

      std::ldiv_t

      struct ldiv_t{long quot;long rem;};

      or

      struct ldiv_t{long rem;long quot;};

      std::lldiv_t

      struct lldiv_t{longlong quot;longlong rem;};

      or

      struct lldiv_t{longlong rem;longlong quot;};

      std::imaxdiv_t

      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.

      [edit]Notes

      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.

      [edit]Example

      Run this code
      #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

      [edit]See also

      (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]

      [edit]External links

      1. Euclidean division — From Wikipedia.
      2. Modulo (and Truncated division) — From Wikipedia.
      Retrieved from "https://en.cppreference.com/mwiki/index.php?title=cpp/numeric/math/div&oldid=181912"

      [8]ページ先頭

      ©2009-2025 Movatter.jp