#include <bits/stdc++.h>
using namespace std;
const double eps = 1e-9;
struct Point {
  double x, y;
  Point(double x, double y) : x(x), y(y) {}
  Point() : x(0), y(0) {}
  Point operator+(const Point &o) { return Point(x + o.x, y + o.y); }
  Point operator-(const Point &o) { return Point(x - o.x, y - o.y); }
  Point operator*(double k) { return Point(x * k, y * k); }
  Point operator/(double k) { return Point(x / k, y / k); }
};
inline double dot(const Point &a, const Point &b) {
  return a.x * b.x + a.y * b.y;
}
inline double det(const Point &a, const Point &b) {
  return a.x * b.y - a.y * b.x;
}
inline int sign(double a) { return a < -eps ? -1 : a > eps; }
bool left(Point a, Point b, vector<Point> poly) {
  int np = poly.size();
  for (int i = 0; i < np; ++i) {
    if (sign(det(b - a, poly[i] - a)) > 0) {
      return 0;
    }
  }
  return 1;
}
bool right(Point a, Point b, vector<Point> poly) {
  int np = poly.size();
  for (int i = 0; i < np; ++i) {
    if (sign(det(b - a, poly[i] - a)) < 0) {
      return 0;
    }
  }
  return 1;
}
int main() {
  int n;
  double w, v, u;
  cin >> n >> w >> v >> u;
  vector<Point> poly(n);
  for (int i = 0; i < n; ++i) {
    cin >> poly[i].x >> poly[i].y;
    poly[i].x /= v;
  }
  double res = 1e100;
  if (left(Point(0, 0), Point(w / u, w), poly)) {
    res = min(res, w / u);
  }
  if (right(Point(0, 0), Point(w / u, w), poly)) {
    res = min(res, w / u);
  }
  for (int i = 0; i < n; ++i) {
    double x = poly[i].x - poly[i].y / u;
    if (x < 0) {
      continue;
    }
    Point a(x, 0), b(x + w / u, w);
    if (sign(det(b - a, poly[(i + 1) % n] - poly[i])) >= 0 &&
        sign(det(a - b, poly[(i + n - 1) % n] - poly[i])) <= 0) {
      res = min(res, b.x);
    }
    if (sign(det(b - a, poly[(i + 1) % n] - poly[i])) <= 0 &&
        sign(det(a - b, poly[(i + n - 1) % n] - poly[i])) >= 0) {
      res = min(res, b.x);
    }
  }
  printf("%.15f\n", res);
}
