#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;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y21hdGg+CgpzdGQ6OnBhaXI8ZG91YmxlLCBkb3VibGU+IGRpdjEoaW50IG51bSwgZG91YmxlIGRlbm9tKXsKCWRvdWJsZSB3aG9sZSA9IHN0ZDo6Zmxvb3IobnVtIC8gZGVub20pOwoJZG91YmxlIHJlbWFpbiA9IHN0ZDo6Zm1vZChudW0sIGRlbm9tKTsKCXJldHVybiB7d2hvbGUsIHJlbWFpbn07Cn0Kc3RkOjpwYWlyPGRvdWJsZSwgZG91YmxlPiBkaXYyKGludCBudW0sIGRvdWJsZSBkZW5vbSl7Cglkb3VibGUgZmxvYXRkaXYgPSBudW0gLyBkZW5vbTsKCWRvdWJsZSB3aG9sZTsKCWRvdWJsZSByZW1haW4gPSBzdGQ6Om1vZGYoZmxvYXRkaXYsICZ3aG9sZSk7CglyZXR1cm4ge3dob2xlLCByZW1haW4gKiBkZW5vbX07Cn0Kc3RkOjpwYWlyPGRvdWJsZSwgZG91YmxlPiBkaXYzKGludCBudW0sIGRvdWJsZSBkZW5vbSl7Cglkb3VibGUgd2hvbGUgPSBzdGQ6OnJvdW5kKG51bSAvIGRlbm9tKTsKCWRvdWJsZSByZW1haW4gPSBzdGQ6OnJlbWFpbmRlcihudW0sIGRlbm9tKTsKCWlmKHJlbWFpbiA8IDApewoJCXdob2xlLS07CgkJcmVtYWluICs9IGRlbm9tOwoJfQoJcmV0dXJuIHt3aG9sZSwgcmVtYWlufTsKfQpzdGQ6OnBhaXI8ZG91YmxlLCBkb3VibGU+IGRpdjQoIGludCBudW0sICBkb3VibGUgZGVub20pewogICAgaW50IHF1bzsKICAgIGF1dG8gcmVtID0gc3RkOjpyZW1xdW8obnVtLCBkZW5vbSwgJnF1byApOwogICAgcmV0dXJuIHtxdW8sIHJlbX07Cn0Kc3RkOjpwYWlyPGRvdWJsZSwgZG91YmxlPiBkaXY1KGludCBudW0sIGRvdWJsZSBkZW5vbSl7CiAgICBkb3VibGUgd2hvbGUgPSBzdGQ6OmZsb29yKG51bSAvIGRlbm9tKTsKICAgIGludCBuID0gdHJ1bmMobnVtIC8gZGVub20pIDsKICAgIGRvdWJsZSByZW1haW4gPSBudW0gLSBuICogZGVub20gOwogICAgcmV0dXJuIHt3aG9sZSwgcmVtYWlufTsKfQpzdGQ6OnBhaXI8ZG91YmxlLCBkb3VibGU+IGRpdjYoaW50IG51bSwgZG91YmxlIGRlbm9tKQp7CiAgICBkb3VibGUgd2hvbGUgPSBzdGQ6OmZsb29yKG51bSAvIGRlbm9tKTsKICAgIGRvdWJsZSByZW1haW4gPSBzdGQ6OmZtYSh3aG9sZSwgLWRlbm9tLCBudW0pOwogICAgaWYgKHJlbWFpbiA8IDApCiAgICB7CiAgICAgICAgLS13aG9sZTsKICAgICAgICByZW1haW4gPSBzdGQ6OmZtYSh3aG9sZSwgLWRlbm9tLCBudW0pOwogICAgfQogICAgcmV0dXJuIHt3aG9sZSwgcmVtYWlufTsKfQppbnQgbWFpbigpIHsKCWRvdWJsZSBkZW5vbSA9IDEwMC4wIC8gNjsKCWludCBkaXZ0eXBlID0gMDsKCWZvcihhdXRvIGRpdjoge2RpdjEsIGRpdjIsIGRpdjMsIGRpdjQsIGRpdjUsIGRpdjZ9KXsKCSAgICBzdGQ6OmNlcnIgPDwgIj09IFVzaW5nIGRpdiIgPDwgKytkaXZ0eXBlIDw8ICIgZm9yIHRoaXMgcnVuID09XG4iOwogICAgICAgIGZvcihpbnQgaSA9IDQ5OyBpIDw9IDUxOyArK2kpewogICAgICAgICAgICBhdXRvIHJlcyA9IGRpdihpLCBkZW5vbSk7CiAgICAgICAgICAgIHN0ZDo6Y2VyciA8PCBpIDw8ICI6ICIgPDwgcmVzLmZpcnN0IDw8ICIsICIgPDwgcmVzLnNlY29uZCA8PCAiID0gIiA8PCByZXMuZmlyc3QgKiBkZW5vbSArIHJlcy5zZWNvbmQgPDwgIlxuIjsKICAgICAgICB9CiAgICAgICAgYXV0byBvbGRwcmVjID0gc3RkOjpjZXJyLnByZWNpc2lvbig2NCk7CiAgICAgICAgYXV0byByZXMgPSBkaXYoNTAsIGRlbm9tKTsKICAgICAgICBzdGQ6OmNlcnIgPDwgNTAgPDwgIjogIiA8PCByZXMuZmlyc3QgPDwgIiwgIiA8PCByZXMuc2Vjb25kIDw8ICIgPSAiIDw8IHJlcy5maXJzdCA8PCAiICogIiA8PCBkZW5vbSA8PCAiICsgIiA8PCByZXMuc2Vjb25kIDw8ICIgPSAiIDw8IHN0ZDo6Zmxvb3IocmVzLmZpcnN0KSAqIGRlbm9tICsgcmVzLnNlY29uZCA8PCAiXG4iOwogICAgICAgIHN0ZDo6Y2Vyci5wcmVjaXNpb24ob2xkcHJlYyk7CiAgICAgICAgc3RkOjpjZXJyIDw8ICJcbiI7Cgl9CiAgICByZXR1cm4gMDsKfQo=
== Using div1 for this run ==
49: 2, 15.6667 = 49
50: 3, 16.6667 = 66.6667
51: 3, 1 = 51
50: 3, 16.66666666666666429819088079966604709625244140625 = 3 * 16.666666666666667850904559600166976451873779296875 + 16.66666666666666429819088079966604709625244140625 = 66.666666666666657192763523198664188385009765625
== Using div2 for this run ==
49: 2, 15.6667 = 49
50: 3, 0 = 50
51: 3, 1 = 51
50: 3, 0 = 3 * 16.666666666666667850904559600166976451873779296875 + 0 = 50
== Using div3 for this run ==
49: 2, 15.6667 = 49
50: 2, 16.6667 = 50
51: 3, 1 = 51
50: 2, 16.66666666666666429819088079966604709625244140625 = 2 * 16.666666666666667850904559600166976451873779296875 + 16.66666666666666429819088079966604709625244140625 = 50
== Using div4 for this run ==
49: 3, -1 = 49
50: 3, -3.55271e-15 = 50
51: 3, 1 = 51
50: 3, -3.552713678800500929355621337890625e-15 = 3 * 16.666666666666667850904559600166976451873779296875 + -3.552713678800500929355621337890625e-15 = 50
== Using div5 for this run ==
49: 2, 15.6667 = 49
50: 3, 0 = 50
51: 3, 1 = 51
50: 3, 0 = 3 * 16.666666666666667850904559600166976451873779296875 + 0 = 50
== Using div6 for this run ==
49: 2, 15.6667 = 49
50: 2, 16.6667 = 50
51: 3, 1 = 51
50: 2, 16.66666666666666429819088079966604709625244140625 = 2 * 16.666666666666667850904559600166976451873779296875 + 16.66666666666666429819088079966604709625244140625 = 50