#include <bits/stdc++.h>

using namespace std;

const double EPS = 1e-9;

class Point{
public:
	double x, y;
	Point ( double x = 0, double y = 0): x(x), y(y){}
	Point operator + ( Point p ){ return Point(x + p.x, y + p.y); }
	Point operator - ( Point p ){ return Point(x - p.x, y - p.y); }
	Point operator * ( double a ){ return Point(x*a, y*a); }
	double abs() { return sqrt(norm());}
	double norm() { return x*x + y*y; }
	bool operator < ( const Point &p ) const {
		return x != p.x ? x < p.x : y < p.y;
	}
	bool operator == ( const Point &p ) const {
		return fabs(x-p.x) < EPS && fabs(y-p.y) < EPS;
	}
	bool operator != (const Point &p) const {
		return (!(*this == p));
	}
};

typedef Point Vector;
typedef vector<Point> Polygon;

double norm( Vector a ){ return a.x*a.x + a.y*a.y; }
double abs(Vector a) {return (sqrt(norm(a)));}
double abs(Vector a, Vector b) {return (sqrt(norm(a - b)));}
double dot( Vector a, Vector b ){ return a.x*b.x + a.y*b.y; }
double cross( Vector a, Vector b ){ return a.x*b.y - a.y*b.x; }

static const int COUNTER_CLOCKWISE = 1;
static const int CLOCKWISE = -1;
static const int ONLINE_BACK = 2;
static const int ONLINE_FRONT = -2;
static const int ON_SEGMENT = 0;

//3??????????????¢???????±???????
int ccw( Point p0, Point p1, Point p2 ){
	Vector a = p1 - p0;
	Vector b = p2 - p0;
	if (cross(a, b) > EPS) return COUNTER_CLOCKWISE;
	if (cross(a, b) < -EPS) return CLOCKWISE;
	if (dot(a, b) < -EPS) return ONLINE_BACK;
	if (norm(a) < norm(b)) return ONLINE_FRONT;
	return ON_SEGMENT;
}

Point interPointL(Point a1 , Point a2 , Point b1 , Point b2)
{
    Point a = a2 - a1;
    Point b = b2 - b1;
    double t = cross(b, b1 - a1) / cross(b, a);
    Point v = a * t;
    return (a1 + v);
}

#define curr(P, i) P[i]
#define next(P, i) P[(i + 1) % P.size()]

Polygon convexCut(const Polygon& P, const Point &a, const Point &b, bool &check)
{
    Polygon Q;
    for (int i = 0; i < P.size(); ++i) {
        Point A = curr(P, i), B = next(P, i);
        if (ccw(a, b, A) != CLOCKWISE) Q.push_back(A);
        if (ccw(a, b, A) * ccw(a, b, B) < 0){
            check = true;
            Q.push_back(interPointL(A, B, a, b));
        }
    }
    
    return (Q);
}

double polygonArea(Polygon t){
    double ans = 0.0;
    for (unsigned int i = 0; i < t.size(); i++)
        ans += cross(t[i] , t[(i + 1) % t.size()]);
    return (ans / 2);
}

int main()
{
    int n, d, V;

    while (scanf("%d %d %d", &n, &d, &V) && n){
        double S = V * 1.0 / d;
        Polygon v(n);

        for (int i = 0; i < n; i++){
            scanf("%lf %lf", &v[i].x, &v[i].y);
        }

        double ans = 0;
        for (int i = 0; i < n; i++){
            Point now = v[i], nxt = v[(i + 1) % n];
            Point normVec = Point(-(nxt - now).y, (nxt - now).x);
            normVec = normVec * (1 / abs(normVec));
            Polygon cut;

            double lf = 0.0, rg = 1e5;
            for (int j = 0; j < 100; j++){
                double mid = (lf + rg) / 2;
                Vector diff = normVec * mid;
                bool ch = false;

                cut = convexCut(v, nxt + diff, now + diff, ch);

                if (ch && abs(polygonArea(cut)) <= S) lf = mid;
                else rg = mid;
            }
            ans = max(ans, lf);
        }

        printf("%.10lf\n", ans);
    }

	return (0);
}

Measured memory_bytes: 1248