func_code_string: #include <bits/stdc++.h>   const double EPS = 1e-7, pi = 3.141592653589793;   struct unit {     double x, y;     unit(double _x = 0, double _y = 0) : x(_x), y(_y) {}     double cross(const unit &A) const { return x * A.y - y * A.x; }     inline double len() const { return sqrt(x * x + y * y); }     double operator*(const unit &A) const { return x * A.x + y * A.y; }     unit operator*(const double &A) const { return unit(x * A, y * A); }     unit operator-(const unit &A) const { return unit(x - A.x, y - A.y); }     unit operator+(const unit &A) const { return unit(x + A.x, y + A.y); }     unit operator/(const double &A) const { return unit(x / A, y / A); }     inline void out() { printf( %.6lf %.6lf n , x, y); }   };   void rotate(unit &A, double the) {     double x = A.x * cos(the) - A.y * sin(the),            y = A.x * sin(the) + A.y * cos(the);     A = unit(x, y);   }   double r, R, v;   unit now;   void tangentpoint(unit p, unit &A, unit &B) {     double d = p.len();     p = p / d;     double cost = r / d, sint = sqrt(d * d - r * r) / d;     unit ver = unit(-p.y, p.x);     A = (p * r * cost) + (ver * r * sint);     B = (p * r * cost) - (ver * r * sint);   }   inline double min(double a, double b) { return a < b ? a : b; }   double arclength(unit A, unit B) {     return r * acos((A * B) / A.len() / B.len());   }   double calcdis(unit &now, unit tar) {     unit u = unit() - now, v = tar - now;     unit t1, t2, a, b;     tangentpoint(now, t1, t2);     tangentpoint(tar, a, b);     if (v.len() < (t1 - now).len() + sqrt(R * R - r * r)) {       return v.len();     }     double ans = (t1 - now).len() + (b - tar).len() +                  min(min(arclength(t2, a), arclength(t2, b)),                      min(arclength(t1, a), arclength(t1, b)));     return ans;   }   double bs(double l, double u, double st, double w) {     double low = l, up = u;     for (int i = 0; i < 100; i++) {       double mid = (low + up) / 2;       double d = calcdis(now, unit(R * cos(mid), R * sin(mid)));       if (st + (mid - l) / w > d / v)         up = mid;       else         low = mid;     }     return low;   }   int main() {     unit tar;     double vp;     while (~scanf( %lf%lf%lf , &tar.x, &tar.y, &vp)) {       scanf( %lf%lf%lf%lf , &now.x, &now.y, &v, &r);       double theta = acos(now * (unit(-1, 0)) / now.len());       if (now.y < 0) theta *= -1;       rotate(now, theta);       rotate(tar, theta);       R = tar.len();       double w = vp / R, T = 2.0 * pi / w;       double anst = 1e8;       if (tar.y < -EPS) {         double theta = acos(tar * unit(1, 0) / tar.len());         double st = theta / w, et = st + T / 2.0;         double d1 = calcdis(now, unit(R, 0)), d2 = calcdis(now, unit(-R, 0));         int k = ceil((d2 / v - et) / (T));         if (et >= d2 / v) k = 0;         if (st + k * T < d1 / v + EPS) {           double tmp = bs(0, pi, st + k * T, +w);           anst = min(anst, st + k * T + tmp / w);         }         st = et;         et = st + T / 2.0;         k = ceil((d1 / v - et) / (T));         if (et >= d1 / v) k = 0;         if (st + k * T < d2 / v + EPS) {           double tmp = bs(pi, 2 * pi, st + k * T, w);           anst = min(anst, st + k * T + (tmp - pi) / w);         }         if (calcdis(now, unit(R, 0)) / v < theta / w + EPS) {           double tmp = bs(-theta, 0, 0, w);           anst = min(anst, (tmp + theta) / w);         }       } else {         double theta = acos(tar * unit(-1, 0) / tar.len());         double st = theta / w, et = st + T / 2.0;         double d1 = calcdis(now, unit(R, 0)), d2 = calcdis(now, unit(-R, 0));         int k = ceil((d1 / v - et) / (T));         if (et >= d1 / v) k = 0;         if (st + k * T < d2 / v + EPS) {           double tmp = bs(pi, 2 * pi, st + k * T, w);           anst = min(anst, st + k * T + (tmp - pi) / w);         }         st = et;         et = st + T / 2.0;         k = ceil((d2 / v - et) / (T));         if (et >= d2 / v) k = 0;         if (st + k * T < d1 / v + EPS) {           double tmp = bs(0, pi, st + k * T, w);           anst = min(anst, st + k * T + tmp / w);         }         if (calcdis(now, unit(-R, 0)) / v < theta / w + EPS) {           double tmp = bs(pi - theta, pi, 0, w);           anst = min(anst, (tmp - pi + theta) / w);         }       }       printf( %.10lf n , anst);     }   }   