#include <bits/stdc++.h>
using namespace std;
const double chang = 0.99;
const double eps = 1e-12;
const int sum = 10;
struct Node {
  double x, y;
  Node() { x = y = 0.0; }
  Node(double x, double y) : x(x), y(y) {}
} a[1005], b[1005];
int w, h, n;
double randomm() { return rand() % 100 * 1.0 / 100; }
Node change(Node x, double d) {
  double jd = randomm() * 2 * M_PI;
  return Node(x.x + cos(jd) * d, x.y + sin(jd) * d);
}
double dist(Node a, Node b) {
  return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));
}
double found(Node x) {
  double ans = dist(a[1], x), ans2 = dist(a[2], x), dg;
  if (ans < ans2) swap(ans, ans2);
  for (int i = 3; i <= n; i++) {
    dg = dist(a[i], x);
    if (dg < ans) ans = dg;
    if (ans < ans2) swap(ans, ans2);
  }
  return ans;
}
bool legal(Node x) {
  return x.x > -eps && x.x < w + eps && x.y > -eps && x.y < h + eps;
}
int main() {
  srand(unsigned(time(NULL)));
  scanf("%d%d%d", &w, &h, &n);
  for (int i = 1; i <= n; i++) scanf("%lf%lf", &a[i].x, &a[i].y);
  for (int i = 1; i <= sum; i++) b[i].x = randomm() * w, b[i].y = randomm() * h;
  for (double D = sqrt(1ll * w * w + 1ll * h * h); D > eps; D *= chang) {
    for (int i = 1; i <= sum; i++) {
      Node max = b[i];
      double kdd = found(b[i]), kgd;
      for (int j = 1; j <= 6; j++) {
        Node mb = change(b[i], D);
        if (!legal(mb)) continue;
        kgd = found(mb);
        if (kgd > kdd + eps) max = mb, kdd = kgd;
      }
      b[i] = max;
    }
  }
  double ans = 0;
  for (int i = 1; i <= sum; i++) ans = max(ans, found(b[i]));
  printf("%.15lf\n", ans);
  return 0;
}
