Namespaces
Variants

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

From cppreference.net
Common mathematical functions
Nearest integer floating point operations
(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
ヘッダー <cmath> で定義
(1)
float fmod ( float x, float y ) ;

double fmod ( double x, double y ) ;

long double fmod ( long double x, long double y ) ;
(C++23まで)
constexpr /*floating-point-type*/

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

/*floating-point-type*/ y ) ;
(C++23から)
float fmodf ( float x, float y ) ;
(2) (C++11から)
(C++23からconstexpr)
long double fmodl ( long double x, long double y ) ;
(3) (C++11から)
(C++23からconstexpr)
ヘッダー <simd> で定義
template < class V0, class V1 >

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

fmod ( const V0 & v_x, const V1 & v_y ) ;
(S) (C++26から)
ヘッダー <cmath> で定義
template < class Integer >
double fmod ( Integer x, Integer y ) ;
(A) (C++23からconstexpr)
1-3) 除算演算の浮動小数点剰余を計算します x / y ライブラリは、パラメータの型としてすべてのcv修飾されていない浮動小数点型に対する std::fmod のオーバーロードを提供します。 (C++23以降)
S) SIMDオーバーロードは、 v_x v_y に対して要素ごとの std::fmod を実行します。
(定義については math-common-simd-t を参照)
(C++26以降)
A) すべての整数型に対して追加のオーバーロードが提供されており、これらは double として扱われます。
(C++11以降)

この関数によって計算される除算演算 x / y の浮動小数点剰余は、厳密に x - iquot * y という値になります。ここで iquot は、 x / y の小数部が切り捨てられた値です。

返される値は x と同じ符号を持ち、その絶対値は y より小さくなります。

目次

パラメータ

x, y - 浮動小数点または整数値

戻り値

成功した場合、上記で定義された除算 x / y の浮動小数点剰余を返します。

定義域エラーが発生した場合、実装定義の値が返されます(NaNがサポートされている場合はNaN)。

アンダーフローによる範囲エラーが発生した場合、正しい結果(丸め後)が返されます。

エラーハンドリング

エラーは、 math_errhandling で指定された通りに報告されます。

y がゼロの場合、定義域エラーが発生する可能性があります。

IEEE浮動小数点演算(IEC 60559)を実装がサポートしている場合、

  • x が±0で y が非ゼロの場合、±0が返される。
  • x が±∞で y がNaNでない場合、NaNが返され FE_INVALID が発生する。
  • y が±0で x がNaNでない場合、NaNが返され FE_INVALID が発生する。
  • y が±∞で x が有限の場合、 x が返される。
  • いずれかの引数がNaNの場合、NaNが返される。

注記

POSIXでは x が無限大または y がゼロの場合、定義域エラーが発生することが要求されています。

std::fmod は有用ですが、 std::remainder はそうではありません。浮動小数点型から符号なし整数型へのサイレントラッピングを行う場合に有用です: ( 0.0 <= ( y = std :: fmod ( std:: rint ( x ) , 65536.0 ) ) ? y : 65536.0 + y ) の範囲は [ - 0.0 , 65535.0 ] であり、これは unsigned short に対応します。しかし、 std:: remainder ( std:: rint ( x ) , 65536.0 の範囲は [ - 32767.0 , + 32768.0 ] であり、これは signed short の範囲外です。

double バージョンの std::fmod は以下のように実装されているかのように動作します:

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

x - std:: trunc ( x / y ) * y は、 std :: fmod ( x, y ) と等しくならない場合があります。これは、 x / y の丸め処理が std::trunc の引数を初期化する際に精度を失いすぎる場合があるためです(例: x = 30.508474576271183309 , y = 6.1016949152542370172 )。

追加のオーバーロードは (A) と完全に同一である必要はありません。それらは、第一引数 num1 と第二引数 num2 について以下を保証するのに十分であればよいのです:

  • num1 または num2 の型が long double の場合、 std :: fmod ( num1, num2 ) std :: fmod ( static_cast < long double > ( num1 ) ,
    static_cast < long double > ( num2 ) )
    と同じ効果を持つ。
  • それ以外の場合、 num1 および/または num2 の型が double または整数型の場合、 std :: fmod ( num1, num2 ) std :: fmod ( static_cast < double > ( num1 ) ,
    static_cast < double > ( num2 ) )
    と同じ効果を持つ。
  • それ以外の場合、 num1 または num2 の型が float の場合、 std :: fmod ( num1, num2 ) std :: fmod ( static_cast < float > ( num1 ) ,
    static_cast < float > ( num2 ) )
    と同じ効果を持つ。
(C++23まで)

num1 num2 が算術型を持つ場合、 std :: fmod ( num1, num2 ) std :: fmod ( static_cast < /*common-floating-point-type*/ > ( num1 ) ,
static_cast < /*common-floating-point-type*/ > ( num2 ) )
と同じ効果を持つ。ここで /*common-floating-point-type*/ num1 num2 の型の間で最も高い 浮動小数点変換ランク と最も高い 浮動小数点変換サブランク を持つ浮動小数点型であり、整数型の引数は double と同じ浮動小数点変換ランクを持つと見なされる。

最も高いランクとサブランクを持つ浮動小数点型が存在しない場合、 オーバーロード解決 は提供されたオーバーロードから使用可能な候補を生成しない。

(C++23以降)

#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';
    // 特殊な値
    std::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';
    // エラー処理
    std::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";
}

出力例:

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

関連項目

整数除算の商と余りを計算する
(関数)
(C++11) (C++11) (C++11)
除算操作の符号付き余り
(関数)
(C++11) (C++11) (C++11)
符号付き余りおよび除算操作の下位3ビット
(関数)