#include <cmath>
#include <vector>
#include <iomanip>
#include <iostream>
using namespace std;
class point2d {
public:
	double x, y;
	point2d() : x(0), y(0) {};
	point2d(double x_, double y_) : x(x_), y(y_) {};
	bool operator==(const point2d& p) { return x == p.x && y == p.y; }
	bool operator!=(const point2d& p) { return x != p.x || y != p.y; }
	point2d& operator+=(const point2d& p) { x += p.x; y += p.y; return *this; }
	point2d& operator-=(const point2d& p) { x -= p.x; y -= p.y; return *this; }
	point2d& operator*=(const double v) { x *= v; y *= v; return *this; }
	point2d operator+(const point2d& p) const { return point2d(*this) += p; }
	point2d operator-(const point2d& p) const { return point2d(*this) -= p; }
	point2d operator*(const double v) const { return point2d(*this) *= v; }
	double norm() const { return x * x + y * y; }
	double abs() const { return std::sqrt(x * x + y * y); }
	double dot(const point2d& p) const { return x * p.x + y * p.y; }
	double cross(const point2d& p) const { return x * p.y - y * p.x; }
	int ccw(const point2d& p1, const point2d& p2) const {
		// RETURNS: P0 -> P1 -> P2 IS COLLINEAR --> ((P0, P1, P2) IS CENTER --> (2, -2, 0)), COUNTER-CLOCKWISE --> 1, CLOCKWISE --> -1
		point2d pr1 = p1 - point2d(*this);
		point2d pr2 = p2 - point2d(*this);
		if (pr1.cross(pr2) != 0) return pr1.cross(pr2) > 0 ? 1 : -1;
		if (pr1.dot(pr2) < 0) return 2;
		return pr1.norm() < pr2.norm() ? -2 : 0;
	}
};
class segment2d {
public:
	point2d p1, p2;
	segment2d() : p1(point2d()), p2(point2d()) {};
	segment2d(const point2d& p1_, const point2d& p2_) : p1(p1_), p2(p2_) {};
	double norm() const { return (p1 - p2).norm(); }
	double abs() const { return (p1 - p2).abs(); }
};
bool intersect(const segment2d& s1, const segment2d& s2) {
	return s1.p1.ccw(s1.p2, s2.p1) * s1.p1.ccw(s1.p2, s2.p2) <= 0 && s2.p1.ccw(s2.p2, s1.p1) * s2.p1.ccw(s2.p2, s1.p2) <= 0;
}
point2d intersect_point(const segment2d &s1, const segment2d &s2) {
	point2d base = s2.p2 - s2.p1;
	double d1 = std::abs(base.cross(s1.p1 - s2.p1));
	double d2 = std::abs(base.cross(s1.p2 - s2.p1));
	return s1.p1 + (s1.p2 - s1.p1) * (d1 / (d1 + d2));
}
double area(const std::vector<point2d>& v) {
	double sum = 0.0;
	for (int i = 0; i < v.size(); ++i) {
		sum += v[i].cross(v[(i + 1) % v.size()]);
	}
	return std::abs(sum) * 0.5;
}
int main() {
	int N, D, V;
	while (cin >> N >> D >> V, N) {
		vector<point2d> v(N);
		for (int i = 0; i < N; ++i) {
			cin >> v[i].x >> v[i].y;
		}
		double l = 0.0, r = 3000.0;
		for (int i = 0; i < 50; ++i) {
			double m = (l + r) * 0.5;
			bool ok = false;
			for (int j = 0; j < N; ++j) {
				point2d vec = v[(j + 1) % N] - v[j];
				point2d normvec(-vec.y, vec.x);
				point2d seg1 = v[j] + normvec * (m / normvec.abs());
				point2d seg2 = seg1 + vec * 10000;
				seg1 -= vec * 10000;
				vector<int> id;
				vector<point2d> poly;
				for (int k = 0; k < N; ++k) {
					if (intersect(segment2d(seg1, seg2), segment2d(v[k], v[(k + 1) % N]))) {
						id.push_back(k);
						poly.push_back(intersect_point(segment2d(seg1, seg2), segment2d(v[k], v[(k + 1) % N])));
					}
				}
				if (id.size() <= 1) continue;
				if (id[0] <= j && j + 1 <= id[1]) {
					for (int k = id[0] + 1; k <= id[1]; ++k) {
						poly.push_back(v[k]);
					}
					poly.push_back(poly[1]);
					poly.erase(poly.begin() + 1);
				}
				else {
					for (int k = id[1] + 1; k <= id[0] + N; ++k) {
						poly.push_back(v[k % N]);
					}
					poly.push_back(poly[0]);
					poly.erase(poly.begin());
				}
				double s = area(poly);
				if (s * D < V) ok = true;
			}
			if (ok) l = m;
			else r = m;
		}
		cout << fixed << setprecision(10) << l << endl;
	}
	return 0;
}


Measured memory_bytes: 3124