#include <stdio.h>
#include <float.h>
#include <math.h>
typedef double real_T;
real_T rt_roundd(real_T u)
{
real_T y;
if (fabs(u
) < 4.503599627370496E+15) { if (u >= 0.5) {
} else if (u > -0.5) {
y = 0.0;
} else {
}
} else {
y = u;
}
return y;
}
real_T rt_modd(real_T u0, real_T u1)
{
real_T y;
real_T tmp;
if (u1 == 0.0) {
y = u0;
} else {
tmp = u0 / u1;
y
= u0
- floor(tmp
) * u1
; } else if (fabs(tmp
- rt_roundd
(tmp
)) <= DBL_EPSILON
* fabs(tmp
)) { y = 0.0;
} else {
y
= (tmp
- floor(tmp
)) * u1
; }
}
return y;
}
real_T rt_remd(real_T u0, real_T u1)
{
real_T y;
real_T tr;
if ((u1 != 0.0) && (u1 != trunc(u1))) {
tr = u0 / u1;
if (fabs(tr
- rt_roundd
(tr
)) <= DBL_EPSILON
* fabs(tr
)) { y = 0.0;
} else {
y = fmod(u0, u1);
}
} else {
y = fmod(u0, u1);
}
return y;
}
int main(void)
{
double i;
for (i=-5.3;i<51;i++)
{printf("%f\n", rt_modd
(23,DBL_EPSILON
)); printf("%f\n", rt_remd
(23,DBL_EPSILON
)); }
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxmbG9hdC5oPgojaW5jbHVkZSA8bWF0aC5oPgoKdHlwZWRlZiBkb3VibGUgcmVhbF9UOwoKCnJlYWxfVCBydF9yb3VuZGQocmVhbF9UIHUpCnsKcmVhbF9UIHk7CiAgaWYgKGZhYnModSkgPCA0LjUwMzU5OTYyNzM3MDQ5NkUrMTUpIHsKICAgIGlmICh1ID49IDAuNSkgewogICAgICB5ID0gZmxvb3IodSArIDAuNSk7CiAgICB9IGVsc2UgaWYgKHUgPiAtMC41KSB7CiAgICAgIHkgPSAwLjA7CiAgICB9IGVsc2UgewogICAgICB5ID0gY2VpbCh1IC0gMC41KTsKICAgIH0KICB9IGVsc2UgewogICAgeSA9IHU7CiAgfQoKICByZXR1cm4geTsKfQoKcmVhbF9UIHJ0X21vZGQocmVhbF9UIHUwLCByZWFsX1QgdTEpCnsKICByZWFsX1QgeTsKICByZWFsX1QgdG1wOwogIGlmICh1MSA9PSAwLjApIHsKICAgIHkgPSB1MDsKICB9IGVsc2UgewogICAgdG1wID0gdTAgLyB1MTsKICAgIGlmICh1MSA8PSBmbG9vcih1MSkpIHsKICAgICAgeSA9IHUwIC0gZmxvb3IodG1wKSAqIHUxOwogICAgfSBlbHNlIGlmIChmYWJzKHRtcCAtIHJ0X3JvdW5kZCh0bXApKSA8PSBEQkxfRVBTSUxPTiAqIGZhYnModG1wKSkgewogICAgICB5ID0gMC4wOwogICAgfSBlbHNlIHsKICAgICAgeSA9ICh0bXAgLSBmbG9vcih0bXApKSAqIHUxOwogICAgfQogIH0KCiAgcmV0dXJuIHk7Cn0KCnJlYWxfVCBydF9yZW1kKHJlYWxfVCB1MCwgcmVhbF9UIHUxKQoJewoJICByZWFsX1QgeTsKCSAgcmVhbF9UIHRyOwoJICBpZiAoKHUxICE9IDAuMCkgJiYgKHUxICE9IHRydW5jKHUxKSkpIHsKCSAgICB0ciA9IHUwIC8gdTE7CgkgICAgaWYgKGZhYnModHIgLSBydF9yb3VuZGQodHIpKSA8PSBEQkxfRVBTSUxPTiAqIGZhYnModHIpKSB7CgkgICAgICB5ID0gMC4wOwoJICAgIH0gZWxzZSB7CgkgICAgICB5ID0gZm1vZCh1MCwgdTEpOwoJICAgIH0KCSAgfSBlbHNlIHsKCSAgICB5ID0gZm1vZCh1MCwgdTEpOwoJICB9CgkKCSAgcmV0dXJuIHk7Cgl9CgoKCmludCBtYWluKHZvaWQpCnsKCWRvdWJsZSBpOwogICAgZm9yIChpPS01LjM7aTw1MTtpKyspCiAgICB7cHJpbnRmKCIlZlxuIiwgcnRfbW9kZCgyMyxEQkxfRVBTSUxPTikpOwogICAgcHJpbnRmKCIlZlxuIiwgcnRfcmVtZCgyMyxEQkxfRVBTSUxPTikpOwogICAgfQogICAgcmV0dXJuIDA7Cn0=