home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / snip9707.zip / RND_DIV.C < prev    next >
C/C++ Source or Header  |  1997-07-05  |  1KB  |  61 lines

  1. /* +++Date last modified: 05-Jul-1997 */
  2.  
  3. /*
  4. **  RND_DIV.C - Rounded integer division
  5. **
  6. **  Public domain - suggested by Dave Hansen in comp.lang.c
  7. */
  8.  
  9. #include <stdlib.h>
  10.  
  11. int round_div(int n, int d)
  12. {
  13.       div_t res = div(n,d);
  14.       div_t rnd = div(res.rem, (abs(d)+1)/2 );
  15.  
  16.       return res.quot + rnd.quot;
  17. }
  18.  
  19. long round_ldiv(long n, long d)
  20. {
  21.       ldiv_t res = ldiv(n,d);
  22.       ldiv_t rnd = ldiv(res.rem, (abs(d)+1)/2 );
  23.  
  24.       return res.quot + rnd.quot;
  25. }
  26.  
  27. #ifdef TEST
  28.  
  29. #include <stdio.h>
  30. #include <limits.h>
  31.  
  32. main(int argc, char *argv[])
  33. {
  34.       long n, d, q;
  35.  
  36.       if (argc != 3)
  37.       {
  38.             puts("Usage: RND_DIV n d\n");
  39.             puts("Returns n/d rounded to nearest integer");
  40.             return -1;
  41.       }
  42.  
  43.       n = atol(argv[1]);
  44.       d = atol(argv[2]);
  45.  
  46.       if (n > INT_MAX || d > INT_MAX)
  47.       {
  48.             q = round_ldiv(n, d);
  49.             printf("round_ldiv(%ld, %ld) = %ld\n", n, d, q);
  50.       }
  51.       else
  52.       {
  53.             q = (long)round_div((int)n, (int)d);
  54.             printf("round_div(%ld, %ld) = %ld\n", n, d, q);
  55.       }
  56.  
  57.       return 0;
  58. }
  59.  
  60. #endif /* TEST */
  61.