#include <iostream>
#include <limits>
#include <cmath>
using namespace std;
double moda(double x, double y)
{
return x - (y * static_cast<int>(x / y));
}
template <class S, class T>
S unsafe_cast(T t)
{
union
{
T _t;
S _s;
} a;
a._t = t;
return a._s;
}
double mod(double x, double y)
{
if ((unsafe_cast<unsigned long long>(x) | unsafe_cast<unsigned long long>(y)) & (0x1 << 63))
{
return moda(x, y);
}
while (x - y >= 0)
{
x -= y;
}
return x;
}
void test_case(double x, double y)
{
cout << "case: " << x << " % " << y << "\n";
cout << "actual: " << fmod(x, y) << "\n";
cout << "moda: " << mod(x, y) << "\n";
cout << " --- " << endl;
}
int main() {
test_case(5, 3);
test_case(-5, 3);
test_case(5, -3);
test_case(-5, -3);
test_case(5, numeric_limits<double>::infinity());
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bGltaXRzPgojaW5jbHVkZSA8Y21hdGg+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKZG91YmxlIG1vZGEoZG91YmxlIHgsIGRvdWJsZSB5KQp7CglyZXR1cm4geCAtICh5ICogc3RhdGljX2Nhc3Q8aW50Pih4IC8geSkpOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgUywgY2xhc3MgVD4KUyB1bnNhZmVfY2FzdChUIHQpCnsKCXVuaW9uCgl7CgkJVCBfdDsKCQlTIF9zOwoJfSBhOwoJYS5fdCA9IHQ7CglyZXR1cm4gYS5fczsKfQoKZG91YmxlIG1vZChkb3VibGUgeCwgZG91YmxlIHkpCnsKCWlmICgodW5zYWZlX2Nhc3Q8dW5zaWduZWQgbG9uZyBsb25nPih4KSB8IHVuc2FmZV9jYXN0PHVuc2lnbmVkIGxvbmcgbG9uZz4oeSkpICYgKDB4MSA8PCA2MykpCgl7CgkJcmV0dXJuIG1vZGEoeCwgeSk7Cgl9CgkKICAgIHdoaWxlICh4IC0geSA+PSAwKQogICAgewogICAgICAgIHggLT0geTsKICAgIH0KCiAgICByZXR1cm4geDsKfQoKdm9pZCB0ZXN0X2Nhc2UoZG91YmxlIHgsIGRvdWJsZSB5KQp7Cgljb3V0IDw8ICJjYXNlOiAiIDw8IHggPDwgIiAlICIgPDwgeSA8PCAiXG4iOwoJY291dCA8PCAiYWN0dWFsOiAiIDw8IGZtb2QoeCwgeSkgPDwgIlxuIjsKCWNvdXQgPDwgIm1vZGE6ICIgPDwgbW9kKHgsIHkpIDw8ICJcbiI7Cgljb3V0IDw8ICIgLS0tICIgPDwgZW5kbDsKfQoKaW50IG1haW4oKSB7Cgl0ZXN0X2Nhc2UoNSwgMyk7Cgl0ZXN0X2Nhc2UoLTUsIDMpOwoJdGVzdF9jYXNlKDUsIC0zKTsKCXRlc3RfY2FzZSgtNSwgLTMpOwoJCgl0ZXN0X2Nhc2UoNSwgbnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aW5maW5pdHkoKSk7CglyZXR1cm4gMDsKfQ==