Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #define flt_precision_spec "%.9f"
- int main(void) {
- const unsigned int_scale = 6578176U;
- const double float_scale = 65781.76;
- const unsigned long from = 252100000000000UL;
- const unsigned long upto = 252112479876055UL;
- unsigned count = 0;
- printf("Testing from %lu to %lu ...\n",from,upto);
- for (unsigned long i = from; i <= upto; i++) {
- const unsigned int_result_with_potential_overflow = (100U * i) / int_scale;
- const double flt_result = i / float_scale;
- const unsigned rounded_flt_result = flt_result;
- const unsigned int_result_without_overflow = (i/128U + i/256U + i/2048U + (i % 128U * 16U + i % 256U * 8U + i % 2048U)/2048U) / 803U;
- if (int_result_with_potential_overflow != rounded_flt_result) {
- 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);
- count++;
- if (int_result_with_potential_overflow != int_result_without_overflow) {
- 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);
- count++;
- if (rounded_flt_result != int_result_without_overflow) {
- 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);
- count++;
- }
- } else { // int_result_with_potential_overflow == int_result_without_overflow
- // Then rounded_flt_result != int_result_without_overflow.
- 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);
- count++;
- }
- } else { // int_result_with_potential_overflow == rounded_flt_result
- if (int_result_with_potential_overflow != int_result_without_overflow) {
- 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);
- count++;
- // In this case also rounded_flt_result != int_result_without_overflow
- 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);
- count++;
- } // else int_result_with_potential_overflow == int_result_without_overflow. Then also rounded_flt_result == int_result_without_overflow.
- }
- }
- printf("%u differences\n", count);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement