fmod関数|float/double型の割り算の余りを求める方法【浮動小数点数の剰余】

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)が発生する場合があります。その際、戻り値は0NaNなどの処理系依存の結果となります。なお定義域エラーが発生した場合、errnoにはEDOMマクロ定数の値がセットされます。

printf("%f", fmod(1, 0)); // nan (処理系依存)
assert( errno == EDOM );  // 処理系依存

広告