fork download
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <stdint.h>
  4.  
  5. enum {
  6. MAX = ~0ull,
  7. base = 1ull << 32
  8. };
  9.  
  10. uint64_t clamp_mul(uint64_t a, uint64_t b)
  11. {
  12. if (MAX / a < b) return MAX;
  13.  
  14. return a * b;
  15. }
  16.  
  17. uint64_t mod_mul(uint64_t a, uint64_t b)
  18. {
  19. uint64_t a1 = a / base;
  20. uint64_t a0 = a % base;
  21. uint64_t b1 = b / base;
  22. uint64_t b0 = b % base;
  23.  
  24. uint64_t lo = a0 * b0;
  25. uint64_t hi = clamp_mul(a1, b0) % base
  26. + clamp_mul(a0, b1) % base
  27. + lo / base;
  28.  
  29. return (hi % base) * base + (lo % base);
  30. }
  31.  
  32. uint64_t stdc_mul(uint64_t a, uint64_t b)
  33. {
  34. return a * b;
  35. }
  36.  
  37. void roll(unsigned n, uint64_t a, uint64_t x,
  38. uint64_t (*mul)(uint64_t a, uint64_t b))
  39. {
  40. while (n-- ) {
  41. x = mul(x, a);
  42.  
  43. printf("%lu\n", x);
  44. }
  45.  
  46. puts("");
  47. }
  48.  
  49.  
  50. int main(void)
  51. {
  52. uint64_t a = 1181783497276652981ull;
  53. uint64_t x = 1000000000;
  54.  
  55. unsigned n = 10;
  56.  
  57. puts("Matlab:"); roll(n, a, x, clamp_mul);
  58. puts("Std C"); roll(n, a, x, stdc_mul);
  59. puts("Modulo"); roll(n, a, x, mod_mul);
  60.  
  61. return 0;
  62. }
  63.  
Success #stdin #stdout 0s 5488KB
stdin
Standard input is empty
stdout
Matlab:
18446744073709551615
18446744073709551615
18446744073709551615
18446744073709551615
18446744073709551615
18446744073709551615
18446744073709551615
18446744073709551615
18446744073709551615
18446744073709551615

Std C
13977895229736538624
1155095838659738112
4603344543258001920
15352754015931247104
1109690372602343936
12757721052488358400
1094529945464775168
4190949131043244544
610544999449465344
9066083554544335360

Modulo
13977895229736538624
1155095838659738112
4603344543258001920
15352754015931247104
1109690372602343936
12757721052488358400
1094529945464775168
4190949131043244544
610544999449465344
9066083554544335360