#include <bits/stdc++.h>
using namespace std;
const int N = 1010;
const double eps = 1e-9;
const double pi = acos(-1.0);
int Sng(double x) {
  if (x < -eps) return -1;
  if (x > eps) return 1;
  return 0;
}
class Point {
 public:
  double x, y;
  Point(double x = 0, double y = 0) : x(x), y(y) {}
  void Read() { scanf("%lf%lf", &x, &y); }
  double Angle() { return atan2(y, x); }
  friend double Dis(const Point &A, const Point &B);
};
Point operator-(const Point &A, const Point &B) {
  return Point(A.x - B.x, A.y - B.y);
}
double Dis(const Point &A, const Point &B) {
  return sqrt(((A.x - B.x) * (A.x - B.x)) + ((A.y - B.y) * (A.y - B.y)));
}
struct Data {
  double x;
  int io;
  Data(double x = 0, int io = 0) : x(x), io(io) {}
  bool operator<(const Data &O) const {
    if (Sng(x - O.x)) return x < O.x;
    return io > O.io;
  }
};
void Good(double &x) {
  while (x < -pi) x += 2.0 * pi;
  while (x > pi) x -= 2.0 * pi;
}
Point p[N];
Data sk[N * 20];
double ang[N][N], dis[N][N];
int w, h, n, top;
int Add(double l, double r) {
  Good(l);
  Good(r);
  sk[top++] = (Data(l, 1));
  sk[top++] = (Data(r, -1));
  return l > r;
}
bool Check(int id, double m) {
  if (Sng(m) == 0) return true;
  int cnt = 0;
  top = 0;
  if (p[id].x < m) {
    double agl = acos(p[id].x / m);
    cnt += Add(pi - agl, pi + agl);
    cnt += Add(pi - agl, pi + agl);
  }
  if (p[id].x + m > w) {
    double agl = acos((w - p[id].x) / m);
    cnt += Add(-agl, agl);
    cnt += Add(-agl, agl);
  }
  if (p[id].y < m) {
    double agl = acos(p[id].y / m);
    cnt += Add(1.5 * pi - agl, 1.5 * pi + agl);
    cnt += Add(1.5 * pi - agl, 1.5 * pi + agl);
  }
  if (p[id].y + m > h) {
    double agl = acos((h - p[id].y) / m);
    cnt += Add(0.5 * pi - agl, 0.5 * pi + agl);
    cnt += Add(0.5 * pi - agl, 0.5 * pi + agl);
  }
  for (int i = 0; i < n; i++) {
    if (i == id || Sng(dis[id][i]) == 0 || dis[id][i] >= 2 * m) continue;
    double agl = acos((dis[id][i] / 2 / m));
    cnt += Add(ang[i][id] - agl, ang[i][id] + agl);
  }
  if (cnt <= 1) return true;
  sort(sk, sk + top);
  for (int i = 0; i < top; i++) {
    cnt += sk[i].io;
    if (cnt <= 1) return true;
  }
  return false;
}
int main() {
  scanf("%d%d%d", &w, &h, &n);
  for (int i = 0; i < n; i++) {
    p[i].Read();
  }
  random_shuffle(p, p + n);
  for (int i = 0; i < n; i++)
    for (int j = i + 1; j < n; j++) {
      ang[i][j] = (p[i] - p[j]).Angle();
      ang[j][i] = (p[j] - p[i]).Angle();
      dis[j][i] = dis[i][j] = Dis(p[i], p[j]);
    }
  double ans = 0.0;
  for (int i = 0; i < n; i++) {
    if (Check(i, ans + eps) == false) continue;
    double l = ans, r = sqrt(1.0 * w * w + 1.0 * h * h);
    for (int t = 0; r - l > 1e-10; t++) {
      double mid = (l + r) / 2.0;
      if (Check(i, mid))
        l = mid + eps, ans = mid;
      else
        r = mid - eps;
    }
  }
  printf("%.15lf\n", ans);
  return 0;
}
