Movatterモバイル変換


[0]ホーム

URL:


cppreference.com
Namespaces
Variants
    Actions

      std::fmod,std::fmodf,std::fmodl

      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
      (C++11)
      (C++11)
      (C++11)
      Macro constants
       
      Defined in header<cmath>
      (1)
      float       fmod(float x,float y);

      double      fmod(double x,double y);

      longdouble fmod(longdouble x,longdouble y);
      (until C++23)
      constexpr/*floating-point-type*/

                  fmod(/*floating-point-type*/ x,

                         /*floating-point-type*/ y);
      (since C++23)
      float       fmodf(float x,float y);
      (2)(since C++11)
      (constexpr since C++23)
      longdouble fmodl(longdouble x,longdouble y);
      (3)(since C++11)
      (constexpr since C++23)
      SIMD overload(since C++26)
      Defined in header<simd>
      template<class V0,class V1>

      constexpr/*math-common-simd-t*/<V0, V1>

                  fmod(const V0& v_x,const V1& v_y);
      (S)(since C++26)
      Defined in header<cmath>
      template<class Integer>
      double      fmod( Integer x, Integer y);
      (A)(constexpr since C++23)
      1-3) Computes the floating-point remainder of the division operationx/ y. The library provides overloads ofstd::fmod for all cv-unqualified floating-point types as the type of the parameters.(since C++23)
      S) The SIMD overload performs an element-wisestd::fmod onv_xandv_y.
      (Seemath-common-simd-t for its definition.)
      (since C++26)
      A) Additional overloads are provided for all integer types, which are treated asdouble.
      (since C++11)

      The floating-point remainder of the division operationx/ y calculated by this function is exactly the valuex- iquot* y, whereiquot isx/ y with its fractional part truncated.

      The returned value has the same sign asx and is less thany in magnitude.

      Contents

      [edit]Parameters

      x, y - floating-point or integer values

      [edit]Return value

      If successful, returns the floating-point remainder of the divisionx/ y as defined above.

      If a domain error occurs, an implementation-defined value is returned (NaN where supported).

      If a range error occurs due to underflow, the correct result (after rounding) is returned.

      [edit]Error handling

      Errors are reported as specified inmath_errhandling.

      Domain error may occur ify is zero.

      If the implementation supports IEEE floating-point arithmetic (IEC 60559),

      • Ifx is ±0 andy is not zero, ±0 is returned.
      • Ifx is ±∞ andy is not NaN, NaN is returned andFE_INVALID is raised.
      • Ify is ±0 andx is not NaN, NaN is returned andFE_INVALID is raised.
      • Ify is ±∞ andx is finite,x is returned.
      • If either argument is NaN, NaN is returned.

      [edit]Notes

      POSIX requires that a domain error occurs ifx is infinite ory is zero.

      std::fmod, but notstd::remainder is useful for doing silent wrapping of floating-point types to unsigned integer types:(0.0<=(y= std::fmod(std::rint(x),65536.0))? y:65536.0+ y) is in the range[-0.065535.0], which corresponds tounsignedshort, butstd::remainder(std::rint(x),65536.0 is in the range[-32767.0+32768.0], which is outside of the range ofsignedshort.

      Thedouble version ofstd::fmod behaves as if implemented as follows:

      double fmod(double x,double y){#pragma STDC FENV_ACCESS ONdouble result=std::remainder(std::fabs(x), y=std::fabs(y));if(std::signbit(result))        result+= y;returnstd::copysign(result, x);}

      The expressionx-std::trunc(x/ y)* y may not equalstd::fmod(x, y), when the rounding ofx/ y to initialize the argument ofstd::trunc loses too much precision (example:x=30.508474576271183309,y=6.1016949152542370172).

      The additional overloads are not required to be provided exactly as(A). They only need to be sufficient to ensure that for their first argumentnum1 and second argumentnum2:

      • Ifnum1 ornum2 has typelongdouble, thenstd::fmod(num1, num2) has the same effect asstd::fmod(static_cast<longdouble>(num1),
                 static_cast<longdouble>(num2))
        .
      • Otherwise, ifnum1 and/ornum2 has typedouble or an integer type, thenstd::fmod(num1, num2) has the same effect asstd::fmod(static_cast<double>(num1),
                 static_cast<double>(num2))
        .
      • Otherwise, ifnum1 ornum2 has typefloat, thenstd::fmod(num1, num2) has the same effect asstd::fmod(static_cast<float>(num1),
                 static_cast<float>(num2))
        .
      (until C++23)

      Ifnum1 andnum2 have arithmetic types, thenstd::fmod(num1, num2) has the same effect asstd::fmod(static_cast</*common-floating-point-type*/>(num1),
               static_cast</*common-floating-point-type*/>(num2))
      , where/*common-floating-point-type*/ is the floating-point type with the greatestfloating-point conversion rank and greatestfloating-point conversion subrank between the types ofnum1 andnum2, arguments of integer type are considered to have the same floating-point conversion rank asdouble.

      If no such floating-point type with the greatest rank and subrank exists, thenoverload resolution does not result in a usable candidate from the overloads provided.

      (since C++23)

      [edit]Example

      Run this code
      #include <cfenv>#include <cmath>#include <iostream>// #pragma STDC FENV_ACCESS ON int main(){std::cout<<"fmod(+5.1, +3.0) = "<< std::fmod(5.1,3)<<'\n'<<"fmod(-5.1, +3.0) = "<< std::fmod(-5.1,3)<<'\n'<<"fmod(+5.1, -3.0) = "<< std::fmod(5.1,-3)<<'\n'<<"fmod(-5.1, -3.0) = "<< std::fmod(-5.1,-3)<<'\n'; // special valuesstd::cout<<"fmod(+0.0, 1.0) = "<< std::fmod(0,1)<<'\n'<<"fmod(-0.0, 1.0) = "<< std::fmod(-0.0,1)<<'\n'<<"fmod(5.1, Inf) = "<< std::fmod(5.1,INFINITY)<<'\n'; // error handlingstd::feclearexcept(FE_ALL_EXCEPT);std::cout<<"fmod(+5.1, 0) = "<< std::fmod(5.1,0)<<'\n';if(std::fetestexcept(FE_INVALID))std::cout<<"    FE_INVALID raised\n";}

      Possible output:

      fmod(+5.1, +3.0) = 2.1fmod(-5.1, +3.0) = -2.1fmod(+5.1, -3.0) = 2.1fmod(-5.1, -3.0) = -2.1fmod(+0.0, 1.0) = 0fmod(-0.0, 1.0) = -0fmod(5.1, Inf) = 5.1fmod(+5.1, 0) = -nan    FE_INVALID raised

      [edit]See also

      computes quotient and remainder of integer division
      (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]
      Retrieved from "https://en.cppreference.com/mwiki/index.php?title=cpp/numeric/math/fmod&oldid=175785"

      [8]ページ先頭

      ©2009-2025 Movatter.jp