| // { dg-do run } |
| // { dg-options "-O2" } |
| |
| #define radix 10 |
| __INT32_TYPE__ numDigits(__UINT64_TYPE__ value) |
| { |
| __INT32_TYPE__ n = 1; |
| while (value > __UINT32_MAX__) |
| { |
| n += 4; |
| value /= radix * radix * radix * radix; |
| } |
| __UINT32_TYPE__ v = (__UINT32_TYPE__)value; |
| while (1) |
| { |
| if (v < radix) |
| return n; |
| if (v < radix * radix) |
| return n + 1; |
| if (v < radix * radix * radix) |
| return n + 2; |
| if (v < radix * radix * radix * radix) |
| return n + 3; |
| n += 4; |
| v /= radix * radix * radix * radix; |
| } |
| } |
| |
| int main() |
| { |
| if (numDigits(__UINT64_MAX__) != 20) |
| __builtin_abort(); |
| } |