#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ull = unsigned long long;
using pii = pair<int, int>;
using pll = pair<long long, long long>;
using pdd = pair<double, double>;
void cind(int &a) { scanf("%d", &a); }
void cinll(ll &a) { scanf("%lld", &a); }
void cinf(double &a) { scanf("%f", &a); }
void printd(const int &a) { printf("%d ", a); }
void printll(const ll &a) { printf("%I64d ", a); }
void printf(const double &a) { printf("%.10f ", a); }
struct edge {
  ll from;
  ll to;
  ll cost;
};
vector<int> tin(2e5 + 10);
vector<int> tout(2e5 + 10);
vector<int> used(2e5 + 10, 0);
vector<int> dp1(2e5 + 10, 0);
vector<int> dp2(2e5 + 10, 0);
vector<int> d(2e5, 0);
vector<vector<pll>> g;
ll base = 1e9 + 7;
using namespace std;
ll t = 0;
const int INF = (int)1e9;
vector<int> marked;
vector<vector<int>> g_marked;
vector<edge> edges;
vector<int> tree_size(2e5, 1);
vector<double> p(2e5, 0);
map<pii, int> mp;
double res = 0;
struct point {
  double x, y;
};
vector<point> xs;
double psevdo(point a, point b, point c) {
  return (b.x - a.x) * (c.y - a.y) - (b.y - a.y) * (c.x - a.x);
}
bool is_belong(point a, double u, double v, double t) {
  return (abs(a.y * v - u * (a.x - v * t)) < 1e-5);
}
bool segment_intersect(point a1, point a2, point b1, point b2) {
  if (psevdo(a1, a2, b1) * psevdo(a1, a2, b2) > 0) {
    return false;
  }
  if (psevdo(b1, b2, a1) * psevdo(b1, b2, a2) > 0) {
    return false;
  }
  if (!psevdo(a1, a2, b1) || !psevdo(a1, a2, b2)) {
    if (!psevdo(a1, a2, b1)) {
      if (b1.x >= min(a1.x, a2.x) && b1.x <= max(a1.x, a2.x)) {
        return true;
      }
    }
    if (!psevdo(a1, a2, b2)) {
      if (b2.x >= min(a1.x, a2.x) && b2.x <= max(a1.x, a2.x)) {
        return true;
      }
    }
    return false;
  }
  return true;
}
bool can(double u, double v, double t, double w) {
  vector<int> last_belong;
  for (int i = 1; i < xs.size(); ++i) {
    if (segment_intersect(xs[i - 1], xs[i], {0, -t * u},
                          {w * v / u + v * t, w})) {
      if (is_belong(xs[i], u, v, t)) {
        if (is_belong(xs[i - 1], u, v, t)) {
          return true;
        } else {
          if (last_belong.size() && last_belong.back() != i - 1) {
            return false;
          }
          last_belong.push_back(i);
        }
      } else {
        if (!is_belong(xs[i - 1], u, v, t)) {
          return false;
        }
      }
    }
  }
  return true;
}
int main() {
  int n, w, v, u;
  cind(n), cind(w), cind(v), cind(u);
  xs.resize(n);
  for (int i = 0; i < n; ++i) {
    scanf("%lf%lf", &xs[i].x, &xs[i].y);
  }
  xs.push_back(xs[0]);
  if (can(u, v, 0.0, w)) {
    printf("%.7lf", (double)w / u);
    return 0;
  }
  double l = 0, r = 1e8;
  for (int i = 0; i < 200; ++i) {
    double m = (l + r) / 2;
    if (can(u, v, m, w)) {
      r = m;
    } else {
      l = m;
    }
  }
  printf("%.7lf", (double)w / u + l);
}
