#include <iostream>
#include <cmath>

std::pair<double, double> div1(int num, double denom){
	double whole = std::floor(num / denom);
	double remain = std::fmod(num, denom);
	return {whole, remain};
}
std::pair<double, double> div2(int num, double denom){
	double floatdiv = num / denom;
	double whole;
	double remain = std::modf(floatdiv, &whole);
	return {whole, remain * denom};
}
std::pair<double, double> div3(int num, double denom){
	double whole = std::round(num / denom);
	double remain = std::remainder(num, denom);
	if(remain < 0){
		whole--;
		remain += denom;
	}
	return {whole, remain};
}
std::pair<double, double> div4( int num,  double denom){
    int quo;
    auto rem = std::remquo(num, denom, &quo );
    return {quo, rem};
}
std::pair<double, double> div5(int num, double denom){
    double whole = std::floor(num / denom);
    int n = trunc(num / denom) ;
    double remain = num - n * denom ;
    return {whole, remain};
}
std::pair<double, double> div6(int num, double denom)
{
    double whole = std::floor(num / denom);
    double remain = std::fma(whole, -denom, num);
    if (remain < 0)
    {
        --whole;
        remain = std::fma(whole, -denom, num);
    }
    return {whole, remain};
}
int main() {
	double denom = 100.0 / 6;
	int divtype = 0;
	for(auto div: {div1, div2, div3, div4, div5, div6}){
	    std::cerr << "== Using div" << ++divtype << " for this run ==\n";
        for(int i = 49; i <= 51; ++i){
            auto res = div(i, denom);
            std::cerr << i << ": " << res.first << ", " << res.second << " = " << res.first * denom + res.second << "\n";
        }
        auto oldprec = std::cerr.precision(64);
        auto res = div(50, denom);
        std::cerr << 50 << ": " << res.first << ", " << res.second << " = " << res.first << " * " << denom << " + " << res.second << " = " << std::floor(res.first) * denom + res.second << "\n";
        std::cerr.precision(oldprec);
        std::cerr << "\n";
	}
    return 0;
}
