#include <bits/stdc++.h>
using namespace std;
const int maxn = 10050;
const double INF = 1e10;
const double eps = 1e-8;
const double pi = acos(-1.0);
struct point {
  double x, y;
  point(double x = 0, double y = 0) : x(x), y(y) {}
};
point operator+(point a, point b) { return point(a.x + b.x, a.y + b.y); }
point operator-(point a, point b) { return point(a.x - b.x, a.y - b.y); }
point operator*(point a, double k) { return point(a.x * k, a.y * k); }
point operator/(point a, double k) { return point(a.x / k, a.y / k); }
point p[maxn];
double w, v1, v2;
int n;
int sig(double x) { return fabs(x) < eps ? 0 : (x > 0) ? 1 : -1; }
double dist(point a, point b) {
  return sqrt((b.x - a.x) * (b.x - a.x) + (b.y - a.y) * (b.y - a.y));
}
double cross(point a, point b, point c) {
  return (b.x - a.x) * (c.y - a.y) - (b.y - a.y) * (c.x - a.x);
}
bool iscross(point p1, point p2, point p3, point p4) {
  if (min(p1.x, p2.x) > max(p3.x, p4.x) || min(p3.x, p4.x) > max(p1.x, p2.x) ||
      min(p1.y, p2.y) > max(p3.y, p4.y) || min(p3.y, p4.y) > max(p1.y, p2.y))
    return 0;
  double r1 = cross(p1, p2, p3), r2 = cross(p1, p2, p4);
  double r3 = cross(p3, p4, p1), r4 = cross(p3, p4, p2);
  return sig(r1) * sig(r2) < 0 && sig(r3) * sig(r4) < 0;
}
void solve() {
  scanf("%d %lf %lf %lf", &n, &w, &v1, &v2);
  for (int i = 1; i <= n; i++) scanf("%lf %lf", &p[i].x, &p[i].y);
  p[n + 1] = p[1];
  point v(v1, v2);
  point p1(0, 0), p2 = p1 + v * INF;
  int flag = 0;
  for (int i = 1; i <= n; i++) {
    if (iscross(p1, p2, p[i], p[i + 1])) {
      flag = 1;
      break;
    }
  }
  if (!flag)
    printf("%.10f\n", w / v2);
  else {
    double d = 0.0;
    for (int i = 1; i <= n; i++) {
      double tmp = cross(p1, p[i], p2);
      if (sig(tmp) >= 0) d = max(d, tmp / dist(p1, p2));
    }
    double theta = atan(v2 / v1);
    d = d / sin(theta);
    printf("%.10f\n", w / v2 + d / v1);
  }
}
int main() {
  solve();
  return 0;
}
