#include <bits/stdc++.h>
using namespace std;
const int MaxN = 1005;
const int oo = 1000000000;
const long long Base = 1000000007;
typedef int Tarr[MaxN];
struct Point {
  double x, y;
  Point(){};
  Point(double x, double y) : x(x), y(y) {}
  Point operator+(Point q) { return Point(x + q.x, y + q.y); }
  Point operator-(Point q) { return Point(x - q.x, y - q.y); }
  double operator*(Point q) { return x * q.x + y * q.y; }
  Point operator/(double k) { return Point(x / k, y / k); }
  double Len() { return sqrt(((x) * (x)) + ((y) * (y))); }
  Point Rotate(double alpha) {
    return Point(cos(alpha) * x - sin(alpha) * y,
                 sin(alpha) * x + cos(alpha) * y);
  }
  void print() { cout << x << " " << y << endl; }
};
double xp, yp, xq, yq, v0, v1, r, R;
Point p1, p0, p00;
double GetLen(Point q, Point p) {
  return sqrt(((q.x - p.x) * (q.x - p.x)) + ((q.y - p.y) * (q.y - p.y)));
}
struct Line {
  double a, b, c;
  Line(double a, double b, double c) : a(a), b(b), c(c) {}
};
Line GetLine(Point p, Point q) {
  Point v = q - p;
  double a = -v.y;
  double b = v.x;
  double c = -a * p.x - b * p.y;
  return Line(a, b, c);
}
Point Intersection(Line A, Line B) {
  A.c = -A.c;
  B.c = -B.c;
  double d = A.a * B.b - A.b * B.a;
  double dx = A.c * B.b - A.b * B.c;
  double dy = A.a * B.c - A.c * B.a;
  return Point(dx / d, dy / d);
}
bool Ok(double Mid) {
  double t = (Mid / 10000000) * v0;
  double T = 2 * R * 3.14159265;
  long long tmp = (long long)floor(t / T);
  t -= tmp * T;
  double alpha = 2 * 3.14159265 * t / T;
  p0 = p00.Rotate(alpha);
  Line AB = GetLine(p0, p1);
  Line OC = Line(-AB.b, AB.a, 0);
  Point p2 = Intersection(AB, OC);
  Point V1 = p0 - p2;
  Point V2 = p1 - p2;
  if (p2.Len() < r && V1.x * V2.x <= 0 && V1.y * V2.y <= 0) {
    double alpha1 = acos(r / p0.Len());
    double alpha2 = acos(r / p1.Len());
    double a = GetLen(p0, p1);
    double b = p0.Len();
    double c = p1.Len();
    double bigcos = (((b) * (b)) + ((c) * (c)) - ((a) * (a))) / (2 * b * c);
    double alpha3 = acos(bigcos) - alpha1 - alpha2;
    double S = sqrt(((b) * (b)) - ((r) * (r))) +
               sqrt(((c) * (c)) - ((r) * (r))) + alpha3 * r;
    return S <= ((Mid / 10000000) * v1);
  } else {
    return GetLen(p1, p0) <= ((Mid / 10000000) * v1);
  }
}
int main() {
  cin >> xp >> yp >> v0;
  cin >> xq >> yq >> v1 >> r;
  p00 = Point(xp, yp);
  p1 = Point(xq, yq);
  R = p00.Len();
  long long Low = 0;
  long long High = 10000000000000000ll;
  while (Low <= High) {
    long long Mid = (Low + High) / 2;
    if (Ok(Mid)) {
      if (Mid == 0 || !Ok(Mid - 1)) {
        cout << fixed << setprecision(7) << (double)Mid / 10000000;
        break;
      } else
        High = Mid - 1;
    } else
      Low = Mid + 1;
  }
  return 0;
}
