Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: a guest on Jun 21st, 2012  |  syntax: None  |  size: 1.91 KB  |  hits: 8  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. Advice on optimization floating point calculations: solving a quadratic equation
  2. void detect_collision_of_pair(struct particle* p1, struct particle* p2){
  3.         const double x1  = p1->x;
  4.         const double y1  = p1->y;
  5.         const double z1  = p1->z;
  6.         const double x2  = p2->x;
  7.         const double y2  = p2->y;
  8.         const double z2  = p2->z;
  9.         const double vx1 = p1->vx;
  10.         const double vy1 = p1->vy;
  11.         const double vz1 = p1->vz;
  12.         const double vx2 = p2->vx;
  13.         const double vy2 = p2->vy;
  14.         const double vz2 = p2->vz;
  15.  
  16.         const double a = vx1*vx1 - 2.*vx1*vx2 + vx2*vx2 + vy1*vy1 - 2.*vy1*vy2 + vy2*vy2 + vz1*vz1 - 2.*vz1*vz2 + vz2*vz2;
  17.         const double b = 2.*vx1*x1 - 2.*vx2*x1 - 2.*vx1*x2 + 2.*vx2*x2 + 2.*vy1*y1 - 2.*vy2*y1 - 2.*vy1*y2 + 2.*vy2*y2 + 2.*vz1*z1 - 2.*vz2*z1 - 2.*vz1*z2 + 2.*vz2*z2;
  18.         const double c = -4.*particle_radius*particle_radius + x1*x1 - 2.*x1*x2 + x2*x2 + y1*y1 - 2.*y1*y2 + y2*y2 + z1*z1 - 2.*z1*z2 + z2*z2;
  19.  
  20.         double root = b*b-4.*a*c;
  21.         if (root>=0.){
  22.                 root = sqrt(root);
  23.                 double time1 = (-b-root)/(2.*a);
  24.                 double time2 = (-b+root)/(2.*a);
  25.  
  26.                 if ( (time1>-dt && time1<0.) || (time1<-dt && time2>0) ){
  27.                         double times = -dt;
  28.                         if (time1>-dt || time2<0){
  29.                                 if (time1>-dt){
  30.                                         times = time1;
  31.                                 }else{
  32.                                         times = time2;
  33.                                 }
  34.                         }
  35.                         resolve_collision(p1,p2,times);
  36.                 }
  37.         }
  38. }
  39.        
  40. vx = v1x-v2x;
  41. vy = v1y-v2y;
  42. vz = v1z-v2z;
  43. a = vx*vx + vy*vy + vz*vz;
  44.        
  45. struct particle * const restrict p1
  46.        
  47. const double b = 2 * (vx1*x1 - vx2*x1 - vx1*x2 + vx2*x2 + vy1*y1 - vy2*y1 - vy1*y2 + vy2*y2 + vz1*z1 - vz2*z1 - vz1*z2 + vz2*z2);