fork download
  1. /******************************************************************************
  2.  
  3. Welcome to GDB Online.
  4. GDB online is an online compiler and debugger tool for C, C++, Python, Java, PHP, Ruby, Perl,
  5. C#, OCaml, VB, Swift, Pascal, Fortran, Haskell, Objective-C, Assembly, HTML, CSS, JS, SQLite, Prolog.
  6. Code, Compile, Run and Debug online from anywhere in world.
  7.  
  8. *******************************************************************************/
  9. #include <stdio.h>
  10. #include <stdint.h>
  11.  
  12. typedef struct
  13. {
  14. int16_t val;
  15. const uint8_t bits;
  16. }Fix16;
  17.  
  18. typedef struct
  19. {
  20. int32_t val;
  21. const uint8_t bits;
  22. }Fix32;
  23.  
  24. int16_t fix16_mul(Fix16 a, Fix16 b, uint8_t res_bits);
  25. int32_t fix32_mul(Fix32 a, Fix32 b, uint8_t res_bits);
  26. void fix16_print(Fix16 *fix);
  27.  
  28. #define fix_mul(a,b,res_bits) _Generic((a), \
  29.   Fix16 : fix16_mul, \
  30.   Fix32 : fix32_mul \
  31.   )((a),(b),(res_bits))
  32.  
  33. int main()
  34. {
  35. Fix16 fix16_1 = {256<<7,7};
  36. Fix16 fix16_2 = {1,1};
  37. Fix16 result = {fix_mul(fix16_1,fix16_2,7),7};
  38. printf("Hello World");
  39.  
  40. return 0;
  41. }
  42.  
  43. int16_t fix16_mul(Fix16 a, Fix16 b, uint8_t res_bits)
  44. {
  45. return ((int32_t)a.val * b.val) >> (a.bits + b.bits - res_bits);
  46. }
  47.  
  48. int32_t fix32_mul(Fix32 a, Fix32 b, uint8_t res_bits)
  49. {
  50. return ((int64_t)a.val * b.val) >> (a.bits + b.bits - res_bits);
  51. }
  52.  
  53. void fix16_print(Fix16 *fix)
  54. {
  55. const uint16_t fract = ((float)((fix->val) & ((1<<fix->bits)-1)) / (1<<fix->bits)) * 100;
  56. printf("%d.%3d\n",fix->val>>fix->bits,fract);
  57. }
Success #stdin #stdout 0.01s 5292KB
stdin
45
stdout
Hello World