#include <bits/stdc++.h>
using namespace std;
const double pi = acos(-1.0);
const double eps = 1e-8;
const int inf = 0x3f3f3f3f;
const int M = 1e5 + 10;
int n;
double w, v, u;
struct point {
  int id;
  double x, y;
  double operator*(const point &b) const { return x * b.y - y * b.x; }
  bool operator<(const point &b) const { return (*this) * b > 0; }
} p[M], sp[M];
bool can() {
  p[n] = p[0];
  for (int i = 0; i < n; i++) {
    if (p[i].x < eps && p[i + 1].x < eps) continue;
    if (p[i].x > eps && p[i + 1].x > eps) {
      double Tbus = p[i].x / v;
      double Tp = p[i].y / u;
      if (Tbus + eps < Tp) return false;
      Tbus = p[i + 1].x / v;
      Tp = p[i + 1].y / u;
      if (Tbus + eps < Tp) return false;
      continue;
    }
    point pp = p[i];
    if (p[i].x < eps) pp = p[i + 1];
    double Tbus = pp.x / v;
    double Tp = pp.y / u;
    if (Tp + eps < Tbus) return false;
  }
  return true;
}
double solve() {
  if (can()) {
    return w / u;
  }
  for (int i = 0; i < n; i++) {
    sp[i] = p[i];
    sp[i].id = i;
  }
  sort(sp, sp + n);
  int id = sp[0].id;
  double answer = 0;
  double dx = 0;
  double dy = 0;
  while (true) {
    answer += max((p[id].x - dx) / v, (p[id].y - dy) / u);
    int next = (id + 1) % n;
    if (p[next].x <= p[id].x) {
      answer += (w - p[id].y) / u;
      break;
    }
    dy = p[id].y;
    dx = p[id].x;
    id = next;
  }
  return answer;
}
int main() {
  while (~scanf("%d%lf%lf%lf", &n, &w, &v, &u)) {
    for (int i = 0; i < n; i++) {
      scanf("%lf%lf", &p[i].x, &p[i].y);
    }
    printf("%.10f\n", solve());
  }
  return 0;
}
