名前空間
変種
操作

std::remainder, std::remainderf, std::remainderl

From cppreference.com
< cpp‎ | numeric‎ | math
 
 
 
共通の数学関数
関数
基本的な数学関数
remainder
(C++11)  
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)(C++11)(C++11)
指数関数
(C++11)
(C++11)

(C++11)
(C++11)
べき乗関数
(C++11)
(C++11)
三角関数と
双曲線関数
(C++11)
(C++11)
(C++11)

誤差関数とガンマ関数
(C++11)
(C++11)
(C++11)
(C++11)
最近接整数への浮動小数点数操作
(C++11)(C++11)(C++11)
(C++11)
(C++11)
(C++11)(C++11)(C++11)
浮動小数点数の操作関数
(C++11)(C++11)
(C++11)
(C++11)
(C++11)(C++11)
(C++11)
分類と比較
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
マクロ定数
分類
(C++11)(C++11)(C++11)(C++11)(C++11)


 
ヘッダー <cmath> で定義
(1)
float       remainder ( float x, float y );

double      remainder ( double x, double y );

long double remainder ( long double x, long double y );
(C++23まで)
constexpr /*浮動小数点数型*/

            remainder ( /*浮動小数点型*/ x,

                        /*浮動小数点型*/ y );
(C++23から)
float       remainderf( float x, float y );
(2) (C++11以降)
(C++23 以降 constexpr)
long double remainderl( 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>

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

この関数によって計算される除算演算 x / y のIEEE浮動小数点剰余は、厳密な値 x / y に最も近い整数値 quo を用いた x - quo * y の値に正確に等しくなります。 |quo - x / y| = ½ の場合、quo は偶数となるように選択されます。

std::fmod とは異なり、返される値が x と同じ符号を持つことが保証されているわけではありません。

返される値がゼロの場合、それは x と同じ符号を持ちます。

目次

[編集] Parameters

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

[編集] Return value

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

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

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

y がゼロで、ドメインエラーが発生しない場合、ゼロが返されます。

[編集] Error handling

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

y がゼロの場合、ドメインエラーが発生する可能性があります。

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

  • 現在の 丸めモード は影響しません。
  • FE_INEXACT は決して設定されず、結果は常に正確です。
  • x が ±∞ で、y が NaN でない場合、NaN が返され、FE_INVALID が発生します。
  • y が ±0 で、x が NaN でない場合、NaN が返され、FE_INVALID が発生します。
  • いずれかの引数が NaN の場合、NaN が返されます。

[編集] Notes

POSIXはx が無限大であるか、y がゼロである場合にドメインエラーが発生することを要求しています。

std::fmod は、`std::remainder` ではありませんが、浮動小数点型を符号なし整数型にサイレントにラップするために役立ちます。 (0.0 <= (y = std::fmod(std::rint(x), 65536.0))) ? y : 65536.0 + y[-0.065535.0] の範囲にあり、これは unsigned short に対応しますが、std::remainder(std::rint(x), 65536.0)[-32767.0+32768.0] の範囲にあり、これは signed short の範囲外です。

追加のオーバーロードは (A) とまったく同じように提供される必要はない。それらは、最初の引数 num1 と2番目の引数 num2 に対して以下を保証するのに十分である必要がある。

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

num1num2 が算術型の場合、std::remainder(num1, num2)std::remainder(static_cast</*共通浮動小数点型*/>(num1),
               static_cast</*共通浮動小数点型*/>(num2))
と同等の効果があります。ここで、/*共通浮動小数点型*/ は、num1num2 の型の間で、浮動小数点変換ランクが最も高く、浮動小数点変換サブランクが最も高い浮動小数点型です。整数型の引数は、double と同じ浮動小数点変換ランクを持つとみなされます。

そのような最高のランクとサブランクセを持つ浮動小数点型が存在しない場合、オーバーロード解決は提供されたオーバーロードから使用可能な候補を導出しません。

(C++23から)

[編集] Example

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

実行結果の例

remainder(+5.1, +3.0) = -0.9
remainder(-5.1, +3.0) = 0.9
remainder(+5.1, -3.0) = -0.9
remainder(-5.1, -3.0) = 0.9
remainder(-0.0, 1.0) = -0
remainder(5.1, Inf) = 5.1
remainder(+5.1, 0) = -nan
    FE_INVALID raised

[編集] See also

整数の除算における商と剰余を計算する
(関数) [編集]
(C++11)(C++11)
浮動小数点数の除算操作における剰余
(関数) [編集]
(C++11)(C++11)(C++11)
除算操作における符号付き剰余および商の下位3ビット
(関数) [編集]
Cドキュメント for remainder
English 日本語 中文(简体) 中文(繁體)