Advertisement
Patasuss

Limits

Oct 25th, 2017
180
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.31 KB | None | 0 0
  1. // Example program
  2. #include <iostream>
  3. #include <string>
  4.  
  5. template <typename A>
  6. A myMax(A a,A b)      //this is an overload, not specialization
  7. {
  8.    if (a>b)
  9.       return a;
  10.    else
  11.       return b;
  12. }
  13.  
  14. template <typename A, typename ... Args>
  15. A myMax(A a, A b, Args ... args)
  16. {
  17.    return myMax(myMax(a,b),args...);
  18. }
  19.  
  20. template <typename A>
  21. A myMin(A a,A b)      //this is an overload, not specialization
  22. {
  23.    if (a<b)
  24.       return a;
  25.    else
  26.       return b;
  27. }
  28.  
  29. template <typename A, typename ... Args>
  30. A myMin(A a, A b, Args ... args)
  31. {
  32.    return myMin(myMin(a,b),args...);
  33. }
  34.  
  35. struct Limits {
  36.     Limits() : lower(0), upper(0) {}
  37.     long long int lower;
  38.     long long int upper;
  39. };
  40.  
  41. std::ostream& operator<<(std::ostream& os, const Limits& limits) {
  42.     os << "[" << limits.lower << ", " << limits.upper << "]";
  43.     return os;
  44. }
  45.  
  46. Limits getLimitsPlus(Limits l1, Limits l2) {
  47.     Limits result;
  48.     result.lower = l1.lower + l2.lower;
  49.     result.upper = l1.upper + l2.upper;
  50.     return result;
  51. }
  52.  
  53. Limits getLimitsMinus(Limits lhs, Limits rhs) {
  54.     Limits result;
  55.     result.lower = myMin(lhs.lower-rhs.lower,
  56.                          lhs.lower-rhs.upper,
  57.                          lhs.upper-rhs.lower,
  58.                          lhs.upper-rhs.upper
  59.                          );
  60.     result.upper = myMax(lhs.lower-rhs.lower,
  61.                          lhs.lower-rhs.upper,
  62.                          lhs.upper-rhs.lower,
  63.                          lhs.upper-rhs.upper
  64.                          );
  65.     return result;
  66. }
  67.  
  68. Limits getLimitsMultiply(Limits l1, Limits l2) {
  69.     Limits result;
  70.     result.upper = myMax(l1.lower*l2.lower,
  71.                          l1.lower*l2.upper,
  72.                          l1.upper*l2.lower,
  73.                          l1.upper*l2.upper
  74.                          );
  75.     result.lower = myMin(l1.lower*l2.lower,
  76.                          l1.lower*l2.upper,
  77.                          l1.upper*l2.lower,
  78.                          l1.upper*l2.upper
  79.                          );
  80.     return result;
  81. }
  82.  
  83. Limits getLimitsDivide(Limits lhs, Limits rhs) {
  84.     Limits result;
  85.     result.upper = myMax(lhs.lower/rhs.lower,
  86.                           lhs.lower/rhs.upper,
  87.                           lhs.upper/rhs.lower,
  88.                           lhs.lower/rhs.upper
  89.                           );
  90.     result.lower = myMin(lhs.lower/rhs.lower,
  91.                           lhs.lower/rhs.upper,
  92.                           lhs.upper/rhs.lower,
  93.                           lhs.lower/rhs.upper
  94.                           );
  95.     return result;
  96. }
  97.  
  98. int main()
  99. {
  100.     Limits lhs, rhs;
  101.     lhs.lower = -127;
  102.     lhs.upper = 127;
  103.     rhs.lower = 0;
  104.     rhs.upper = 255;
  105.     std::cout << "RHS: " << rhs << std::endl;
  106.     std::cout << "LHS: " << lhs << std::endl;
  107.     Limits resultPlus, resultMinus, resultMultiply, resultDivide;
  108.     resultPlus = getLimitsPlus(lhs, rhs);
  109.     resultMinus = getLimitsMinus(lhs, rhs);
  110.     resultMultiply = getLimitsMultiply(lhs, rhs);
  111.     resultDivide = getLimitsDivide(lhs, rhs);
  112.     std::cout << lhs << " + " << rhs << " " << resultPlus << std::endl;
  113.     std::cout << lhs << " - " << rhs << " " << resultMinus << std::endl;
  114.     std::cout << lhs << " * " << rhs << " " << resultMultiply << std::endl;
  115.     std::cout << lhs << " / " << rhs << " " << resultDivide << std::endl;
  116. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement