Advertisement
AlMa1r

Untitled

Mar 9th, 2024 (edited)
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.88 KB | Source Code | 0 0
  1. #include <stdio.h>
  2. #define flt_precision_spec "%.9f"
  3.  
  4. int main(void) {
  5.     const unsigned int_scale = 6578176U;
  6.     const double float_scale = 65781.76;
  7.     const unsigned long from = 252100000000000UL;
  8.     const unsigned long upto = 252112479876055UL;
  9.     unsigned count = 0;
  10.     printf("Testing from %lu to %lu ...\n",from,upto);
  11.     for (unsigned long i = from; i <= upto; i++) {
  12.         const unsigned int_result_with_potential_overflow = (100U * i) / int_scale;
  13.         const double flt_result = i / float_scale;
  14.         const unsigned rounded_flt_result = flt_result;
  15.         const unsigned int_result_without_overflow = (i/128U + i/256U + i/2048U + (i % 128U * 16U + i % 256U * 8U + i % 2048U)/2048U) / 803U;
  16.         if (int_result_with_potential_overflow != rounded_flt_result) {
  17.             printf("Difference at i=%lu: 100*i/6578176 = %u not equal %u = floor(" flt_precision_spec ") = floor(i/65781.76) \n", i, int_result_with_potential_overflow, rounded_flt_result, flt_result);
  18.             count++;
  19.             if (int_result_with_potential_overflow != int_result_without_overflow) {
  20.                 printf("Difference at i=%lu: 100*i/6578176 = %u not equal %u = (i/128 + i/256 + i/2048 + (i %% 128 * 16 + i %% 256 * 8 + i %% 2048)/2048) / 803\n", i, int_result_with_potential_overflow, int_result_without_overflow);
  21.                 count++;
  22.                 if (rounded_flt_result != int_result_without_overflow) {
  23.                     printf("Difference at i=%lu: floor(i/65781.76) = floor(" flt_precision_spec ") = %u not equal %u = (i/128 + i/256 + i/2048 + (i %% 128 * 16 + i %% 256 * 8 + i %% 2048)/2048) / 803\n", i, flt_result, rounded_flt_result, int_result_without_overflow);
  24.                     count++;
  25.                 }
  26.             } else { // int_result_with_potential_overflow == int_result_without_overflow
  27.                 // Then rounded_flt_result != int_result_without_overflow.
  28.                 printf("Difference at i=%lu: floor(i/65781.76) = floor(" flt_precision_spec ") = %u not equal %u = (i/128 + i/256 + i/2048 + (i %% 128 * 16 + i %% 256 * 8 + i %% 2048)/2048) / 803\n", i, flt_result, rounded_flt_result, int_result_without_overflow);
  29.                 count++;
  30.             }
  31.         } else { // int_result_with_potential_overflow == rounded_flt_result
  32.             if (int_result_with_potential_overflow != int_result_without_overflow) {
  33.                 printf("Difference at i=%lu: 100*i/6578176 = %u not equal %u = (i/128 + i/256 + i/2048 + (i %% 128 * 16 + i %% 256 * 8 + i %% 2048)/2048) / 803\n", i, int_result_with_potential_overflow, int_result_without_overflow);
  34.                 count++;
  35.                 // In this case also rounded_flt_result != int_result_without_overflow
  36.                 printf("Difference at i=%lu: floor(i/65781.76) = floor(" flt_precision_spec ") = %u not equal %u = (i/128 + i/256 + i/2048 + (i %% 128 * 16 + i %% 256 * 8 + i %% 2048)/2048) / 803\n", i, flt_result, rounded_flt_result, int_result_without_overflow);
  37.                 count++;
  38.             } // else int_result_with_potential_overflow == int_result_without_overflow. Then also rounded_flt_result == int_result_without_overflow.
  39.         }
  40.     }
  41.     printf("%u differences\n", count);
  42. }
  43.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement