fork(1) download
  1. #include <iostream>
  2.  
  3. template <int F>
  4. struct fp
  5. {
  6. enum { BITS = F };
  7. int s;
  8.  
  9. fp(const int32_t & b) : s(b << F) { }
  10. fp(const float & b) : s(b * (1 << F)) { }
  11. template<int T>
  12. fp(const fp<T> & b) { *this = b; }
  13.  
  14. fp & operator=(const int32_t & b) { s = b << F; return *this; }
  15. fp & operator=(const float & b) { s = b * (1 << F); return *this; }
  16. fp & operator=(const fp & b) { s = b.s; return *this; }
  17.  
  18. template<int T>
  19. fp & operator=(const fp<T> & b)
  20. {
  21. if (T > F) { s = b.s >> (T - F); }
  22. else if (T < F) { s = b.s << (F - T); }
  23. else { s = b.s; }
  24. return *this;
  25. }
  26.  
  27. /*fp & operator=(const int32_t & b)
  28. {
  29. s = b << F;
  30. return *this;
  31. }
  32.  
  33. fp & operator=(const float & b)
  34. {
  35. s = b * (1 << F);
  36. return *this;
  37. }*/
  38.  
  39. friend std::ostream & operator<<(std::ostream & os, const fp<F> & a) { os << a.s; return os; }
  40. };
  41.  
  42. using fp824 = fp<24>;
  43. using fp1616 = fp<16>;
  44. using fp248 = fp<8>;
  45.  
  46. int main() {
  47. // your code goes here
  48. fp1616 a0(0); // error: ambiguous?!
  49. fp1616 a1(1); // error: ambiguous?!
  50. fp1616 a2(2); // error: ambiguous?!
  51. fp1616 a3(-2.5f);
  52. std::cout << a0 << std::endl;
  53. std::cout << a1 << std::endl;
  54. std::cout << a2 << std::endl;
  55. std::cout << a3 << std::endl;
  56. a0 = 5; // error: ambiguous?!
  57. a0 = 0; // error: ambiguous?!
  58. a0 = 3.4f;
  59. fp824 b1(1.2f);
  60. fp1616 b2(b1);
  61. fp248 b3(b2);
  62. b1 = b3;
  63. b1 = b2;
  64. return 0;
  65. }
Success #stdin #stdout 0s 15240KB
stdin
Standard input is empty
stdout
0
65536
131072
-163840