cmath にある remquo という 数学関数

浮動小数点剰余を計算する関数 fmod は使ってるが、
剰余と商の両方もほしい場合、何を使うべきかを探してみた。

fmodと同じヘッダにある remquo はよさそうにみえて以下コードを書いてみた

#include <cmath>
#include <iostream>
int main()
{
    int quo;
    auto rem = remquo(59,60,&quo); // 59秒 / 60秒(1分)
    std::cout << "rem:" << rem << " quo:" << quo;
}
結果 : rem:-1 quo:1

剰余は 59 じゃなく -1 になってたけど?

しばらく調べて、どうやら戻り値は remainder の結果と同じです

remainderが返す戻り値の計算式は

x - n * y

実際に実行結果をこの計算式に適用してみた

x = 59
y = 60
n = quo = 1

x - n * y = 59 - 1 * 60 = -1

確かに、計算式はあってるけど・・・

まぁ、とりあえず remquo の挙動が分かった (正しい使い方は不明だが)

検索を再開して、cstdlib ヘッダに div を見つかりました

さっそくコードを書いて予期した挙動を確認した

#include <cstdlib>
#include <iostream>
int main()
{
    auto div = std::div(59,60);
    std::cout << "rem:" << div.rem << " quo:" << div.quot;
}
結果 : rem:59 quo:0