#include <bits/stdc++.h>
using namespace std;
pair<long double, long double> operator+(
    const pair<long double, long double> &a,
    const pair<long double, long double> &b) {
  return make_pair(a.first + b.first, a.second + b.second);
}
pair<long double, long double> operator-(
    const pair<long double, long double> &a,
    const pair<long double, long double> &b) {
  return make_pair(a.first - b.first, a.second - b.second);
}
pair<long double, long double> operator*(
    const pair<long double, long double> &a, long double k) {
  return make_pair(a.first * k, a.second * k);
}
pair<long double, long double> operator/(
    const pair<long double, long double> &a, long double k) {
  return make_pair(a.first / k, a.second / k);
}
long double dot(const pair<long double, long double> &a,
                const pair<long double, long double> &b) {
  return a.first * b.first + a.second * b.second;
}
long double det(const pair<long double, long double> &a,
                const pair<long double, long double> &b) {
  return a.first * b.second - b.first * a.second;
}
long double len2(const pair<long double, long double> &a) {
  return a.first * a.first + a.second * a.second;
}
long double len(const pair<long double, long double> &a) {
  return sqrt(len2(a));
}
long double At(const pair<long double, long double> &a) {
  return atan2(a.second, a.first);
}
const long double EPS = 1E-10;
pair<long double, long double> intersect(
    const pair<long double, long double> &a,
    const pair<long double, long double> &b,
    const pair<long double, long double> &c,
    const pair<long double, long double> &d) {
  long double k1 = det(b - a, c - a), k2 = det(b - a, d - a);
  if (fabs(k1 - k2) < EPS) return make_pair(-1, -1);
  return (d * k1 - c * k2) / (k1 - k2);
}
const int MAXN = 1000 + 10;
struct HP {
  pair<long double, long double> first, v;
  long double agl;
  int id;
  HP() {}
  HP(pair<long double, long double> first, pair<long double, long double> v,
     int id)
      : first(first), v(v), id(id) {
    agl = atan2(v.second, v.first);
  }
  bool operator<(const HP &b) const { return agl < b.agl; }
  void Print() {
    cout << first.first << " " << first.second << " " << first.first + v.first
         << " " << first.second + v.second << endl;
  }
} h[MAXN];
map<pair<int, int>, int> t;
int n, N, W, H, tot;
pair<long double, long double> p[MAXN];
bool ml[MAXN];
void init() {
  scanf("%d%d%d", &W, &H, &N);
  for (int i = 1; i <= N; ++i) {
    pair<int, int> w;
    cin >> w.first >> w.second;
    ++t[w];
  }
  for (map<pair<int, int>, int>::iterator it = t.begin(); it != t.end(); ++it)
    p[++n] = it->first, ml[n] = it->second > 1;
}
long double Count(int l, int r, int w, int id) {
  if (ml[h[w].id] || !h[w].id) return 0;
  static int head, tail, que[MAXN];
  static pair<long double, long double> b[MAXN];
  head = 1, tail = 1, que[1] = l;
  for (int i = l + 1;; ++i) {
    if (i > tot) i = 1;
    if (i == w) continue;
    while (head < tail && det(h[i].v, b[tail - 1] - h[i].first) < EPS) --tail;
    while (head < tail && det(h[i].v, b[head] - h[i].first) < EPS) ++head;
    que[++tail] = i;
    if (head < tail && fabs(h[que[tail - 1]].agl - h[i].agl) < EPS) {
      --tail;
      if (det(h[que[tail]].v, h[i].first - h[que[tail]].first) > 0)
        que[tail] = i;
    }
    if (head < tail)
      b[tail - 1] = intersect(
          h[que[tail - 1]].first, h[que[tail - 1]].first + h[que[tail - 1]].v,
          h[que[tail]].first, h[que[tail]].first + h[que[tail]].v);
    if (i == r) break;
  }
  long double Ririchiyo = 0;
  for (int i = head; i < tail; ++i) {
    if (b[i] != pair<long double, long double>(-1, -1) && b[i].first >= 0 &&
        b[i].first <= (long double)W && b[i].second >= 0 &&
        b[i].second <= (long double)H)
      Ririchiyo = max(Ririchiyo, len(b[i] - p[id]));
  }
  return Ririchiyo;
}
long double Calc(int id) {
  tot = 0;
  h[++tot] = HP(pair<long double, long double>(0, 0),
                pair<long double, long double>(W, 0), 0);
  h[++tot] = HP(pair<long double, long double>(W, 0),
                pair<long double, long double>(0, H), 0);
  h[++tot] = HP(pair<long double, long double>(W, H),
                pair<long double, long double>(-W, 0), 0);
  h[++tot] = HP(pair<long double, long double>(0, H),
                pair<long double, long double>(0, -H), 0);
  for (int i = 1; i <= n; ++i)
    if (i != id) {
      pair<long double, long double> v = p[i] - p[id], o = p[id] + v * 0.5;
      swap(v.first, v.second);
      v.first = -v.first;
      h[++tot] = HP(o, v, i);
    }
  sort(h + 1, h + tot + 1);
  static int head, tail, que[MAXN];
  static pair<long double, long double> b[MAXN];
  head = tail = 1, que[1] = 1;
  for (int i = 2; i <= tot; ++i) {
    while (head < tail && det(h[i].v, b[tail - 1] - h[i].first) < EPS) --tail;
    while (head < tail && det(h[i].v, b[head] - h[i].first) < EPS) ++head;
    que[++tail] = i;
    if (head < tail && fabs(h[que[tail - 1]].agl - h[i].agl) < EPS) {
      --tail;
      if (det(h[que[tail]].v, h[i].first - h[que[tail]].first) > 0)
        que[tail] = i;
    }
    if (head < tail)
      b[tail - 1] = intersect(
          h[que[tail - 1]].first, h[que[tail - 1]].first + h[que[tail - 1]].v,
          h[que[tail]].first, h[que[tail]].first + h[que[tail]].v);
  }
  while (head < tail &&
         det(h[que[head]].v, b[tail - 1] - h[que[head]].first) < 0)
    --tail;
  b[tail] = intersect(h[que[head]].first, h[que[head]].first + h[que[head]].v,
                      h[que[tail]].first, h[que[tail]].first + h[que[tail]].v);
  long double Ririchiyo = 0;
  if (ml[id]) {
    for (int i = head; i <= tail; ++i)
      Ririchiyo = max(Ririchiyo, len(b[i] - p[id]));
  }
  int m = tail - head + 1;
  for (int i = 1, j = head; i <= m; ++i, ++j) que[i] = que[j];
  for (int i = 1; i + 2 <= m; ++i)
    Ririchiyo = max(Ririchiyo, Count(que[i], que[i + 2], que[i + 1], id));
  Ririchiyo = max(Ririchiyo, Count(que[m - 1], que[1], que[m], id));
  Ririchiyo = max(Ririchiyo, Count(que[m], que[2], que[1], id));
  return Ririchiyo;
}
void solve() {
  long double Tohka = 0;
  cout << setprecision(10);
  for (int i = 1; i <= n; ++i) Tohka = max(Tohka, Calc(i));
  cout << fixed << Tohka << endl;
}
int main() {
  init();
  solve();
  fclose(stdin);
  fclose(stdout);
  return 0;
}
