fork download
  1. #include <stdio.h>
  2. #include <float.h>
  3. #include <math.h>
  4.  
  5. typedef double real_T;
  6.  
  7.  
  8. real_T rt_roundd(real_T u)
  9. {
  10. real_T y;
  11. if (fabs(u) < 4.503599627370496E+15) {
  12. if (u >= 0.5) {
  13. y = floor(u + 0.5);
  14. } else if (u > -0.5) {
  15. y = 0.0;
  16. } else {
  17. y = ceil(u - 0.5);
  18. }
  19. } else {
  20. y = u;
  21. }
  22.  
  23. return y;
  24. }
  25.  
  26. real_T rt_modd(real_T u0, real_T u1)
  27. {
  28. real_T y;
  29. real_T tmp;
  30. if (u1 == 0.0) {
  31. y = u0;
  32. } else {
  33. tmp = u0 / u1;
  34. if (u1 <= floor(u1)) {
  35. y = u0 - floor(tmp) * u1;
  36. } else if (fabs(tmp - rt_roundd(tmp)) <= DBL_EPSILON * fabs(tmp)) {
  37. y = 0.0;
  38. } else {
  39. y = (tmp - floor(tmp)) * u1;
  40. }
  41. }
  42.  
  43. return y;
  44. }
  45.  
  46. real_T rt_remd(real_T u0, real_T u1)
  47. {
  48. real_T y;
  49. real_T tr;
  50. if ((u1 != 0.0) && (u1 != trunc(u1))) {
  51. tr = u0 / u1;
  52. if (fabs(tr - rt_roundd(tr)) <= DBL_EPSILON * fabs(tr)) {
  53. y = 0.0;
  54. } else {
  55. y = fmod(u0, u1);
  56. }
  57. } else {
  58. y = fmod(u0, u1);
  59. }
  60.  
  61. return y;
  62. }
  63.  
  64.  
  65.  
  66. int main(void)
  67. {
  68. double i;
  69. for (i=-5.3;i<51;i++)
  70. {printf("%f\n", rt_modd(23,DBL_EPSILON));
  71. printf("%f\n", rt_remd(23,DBL_EPSILON));
  72. }
  73. return 0;
  74. }
Success #stdin #stdout 0.01s 5284KB
stdin
Standard input is empty
stdout
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000