float型やdouble型の浮動小数点数は%
演算子による剰余演算を行うことができません。
0.0 % 0.0; // Invalid operands to binary expression ('double' and 'double')
0.f % 0.f; // Invalid operands to binary expression ('float' and 'float')
浮動小数点数の剰余/余剰を求める場合には、fmod系の関数を用いる必要があります。
// #include <math.h> // double fmod(double x, double y);
fmod(5, 2); // 1 (`5 % 2`に相当。`5 / 2`除算のあまり)
fmod(2, 1.1); // 0.9
fmod関数群(fmodf関数, fmod関数, fmodl関数)
fmod関数群は浮動小数点数の余剰を計算する関数です。double型の剰余演算(モジュロ - modulo)を行う場合にはfmod関数、float型の場合はfmodf関数、long double型の場合はfmodl関数をそれぞれ用いる必要があります。
#include <math.h>
float fmodf(float x, float y);
double fmod(double x, double y);
long double fmodl(long double x, long double y);
第一引数 | x | 分子 |
第二引数 | y | 分母 |
戻り値 | - | x / y の余り |
戻り値は常にxと同一の符号となります。また戻り値の絶対値はyの絶対値より小さいものとなります。
第二引数の分母に対して0
が指定された場合、処理系によっては定義域エラー(domain error)が発生する場合があります。その際、戻り値は0
やNaN
などの処理系依存の結果となります。なお定義域エラーが発生した場合、errno
にはEDOM
マクロ定数の値がセットされます。
printf("%f", fmod(1, 0)); // nan (処理系依存)
assert( errno == EDOM ); // 処理系依存