Guest User

Untitled

a guest
Apr 19th, 2018
191
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.23 KB | None | 0 0
  1. ///////// Adaptive precision floating point arithmetic //////////
  2.  
  3. double sum(double a, double b, double & roundoff)
  4. {
  5.     double res = a + b;
  6.     double bv = res - a;
  7.     double av = res - bv;
  8.     double br = b - bv;
  9.     double ar = a - av;
  10.     roundoff = ar + br;
  11.     return res;
  12. }
  13.  
  14. template <size_t s>
  15. void split(double a, double & hi, double & lo)
  16. {
  17.     double c = ((1LL << s) + 1LL) * a;
  18.     double ab = c - a;
  19.     hi = c - ab;
  20.     lo = a - hi;
  21. }
  22.  
  23. double mul(double a, double b, double & roundoff)
  24. {
  25.     double res = a * b;
  26.     double a_hi, a_lo, b_hi, b_lo;
  27.     split<std::numeric_limits<double>::digits / 2 + std::numeric_limits<double>::digits % 2>(a, a_hi, a_lo);
  28.     split<std::numeric_limits<double>::digits / 2 + std::numeric_limits<double>::digits % 2>(b, b_hi, b_lo);
  29.     double e1 = res - (a_hi * b_hi);
  30.     double e2 = e1 - (a_lo * b_hi);
  31.     double e3 = e2 - (b_lo * a_hi);
  32.     roundoff = (a_lo * b_lo) - e3;
  33.     return res;
  34. }
  35.  
  36. template <size_t m>
  37. void grow_expansion(double * e, double b, double * h)
  38. {
  39.     double q = b;
  40.     for(size_t i = 0; i < m; i++)
  41.         q = sum(e[i], q, h[i]);
  42.     h[m] = q;
  43. }
  44.  
  45. template <size_t m, size_t n>
  46. void expansion_sum(double * e, double * f)
  47. {
  48.     for(size_t i = 0; i < n; i++)
  49.         grow_expansion<m>(e + i, f[i], e + i);
  50. }
  51.  
  52. template <size_t n>
  53. int ap_sign(double * e)
  54. {
  55.     for(int i = n - 1; i >= 0; i--)
  56.     {
  57.         if(e[i] > 0)
  58.             return 1;
  59.         if(e[i] < 0)
  60.             return -1;
  61.     }
  62.     return 0;
  63. }
  64.  
  65. int ap_turn(point a, point b, point c)
  66. {
  67.     double mult[12];
  68.  
  69.     mult[0] = mul(b.x, c.y, mult[1]);
  70.     mult[2] = mul(-b.x, a.y, mult[3]);
  71.     mult[4] = mul(-a.x, c.y, mult[5]);
  72.     mult[6] = mul(-b.y, c.x, mult[7]);
  73.     mult[8] = mul(b.y, a.x, mult[9]);
  74.     mult[10] = mul(a.y, c.x, mult[11]);
  75.  
  76.     expansion_sum<2, 2>(mult, mult + 2);
  77.     expansion_sum<2, 2>(mult + 4, mult + 6);
  78.     expansion_sum<2, 2>(mult + 8, mult + 10);
  79.     expansion_sum<4, 4>(mult, mult + 4);
  80.     expansion_sum<8, 4>(mult, mult + 8);
  81.  
  82.     int res = ap_sign<12>(mult);
  83.  
  84.     return res;
  85. }
  86.  
  87. bool ap_intersection_segments(point a, point b, point c, point d)
  88. {
  89.     if(ap_turn(a, b, c) * ap_turn(a, b, d) <= 0)
  90.     {
  91.         if(ap_turn(c, d, a) * ap_turn(c, d, b) <= 0)
  92.         {
  93.             //if(bounding_box(a, b, c, d))
  94.                 return true;
  95.         }
  96.     }
  97.     return false;
  98. }
  99. ///////// Adaptive precision floating point arithmetic //////////
Add Comment
Please, Sign In to add comment