#include <bits/stdc++.h>
using namespace std;
const double EPS = 1E-8;
inline int SG(double x) {
  if (x > -EPS && x < EPS) return 0;
  return x > 0 ? 1 : -1;
}
class PT {
 public:
  double x, y;
  PT() {}
  PT(double _x, double _y) {
    x = _x;
    y = _y;
  }
  PT operator-(const PT& p) const { return PT(x - p.x, y - p.y); }
  PT operator+(const PT& p) const { return PT(x + p.x, y + p.y); }
  bool operator<(const PT& p) const {
    if (SG(x - p.x) == 0) return SG(y - p.y) < 0;
    return x < p.x;
  }
  double len2() { return x * x + y * y; }
  double operator^(const PT& p) const { return x * p.y - y * p.x; }
  double dis2to(const PT& p) const {
    double dx = x - p.x;
    double dy = y - p.y;
    return dx * dx + dy * dy;
  }
};
PT pt[3010];
PT qt[3010];
int u[3010];
inline double tri(const PT& p1, const PT& p2, const PT& p3) {
  return (p2 - p1) ^ (p3 - p1);
}
int main() {
  int n, i, j, k, tt, r, z, p, q, f, flag, l, s;
  double L, R, M, M2, d;
  scanf("%d", &n);
  for (i = 0; i < n; i++) {
    scanf("%lf %lf", &pt[i].x, &pt[i].y);
  }
  sort(pt, pt + n);
  L = 0;
  R = 100000;
  for (tt = 0; tt < 40; tt++) {
    M = (L + R) / 2;
    M2 = M * M * 4;
    flag = 0;
    for (i = 0; i < n; i++) {
      r = -1;
      f = 0;
      for (j = 0; j < n; j++) {
        if (pt[j].dis2to(pt[i]) < M2) {
          u[j] = 1;
          continue;
        } else {
          f++;
          u[j] = 0;
          l = j;
        }
        while (r > 0 && tri(qt[r - 1], qt[r], pt[j]) < EPS) r--;
        qt[++r] = pt[j];
      }
      if (f <= 1) continue;
      z = r;
      for (j = l - 1; j >= 0; j--) {
        if (u[j]) continue;
        while (r > z && tri(qt[r - 1], qt[r], pt[j]) < EPS) r--;
        qt[++r] = pt[j];
      }
      if (r == 2) {
        if (qt[0].dis2to(qt[1]) >= M2) {
          flag = 1;
          break;
        }
      } else {
        p = 1;
        q = 0;
        f = 0;
        for (j = 1; j < r; j++) {
          if (tri(qt[0], qt[1], qt[j]) > tri(qt[0], qt[1], qt[q])) q = j;
        }
        s = 0;
        while (s < r + 10) {
          d = qt[p].dis2to(qt[q]);
          if (d >= M2) {
            flag = 1;
            goto out;
          }
          if (f) {
            if (((qt[q + 1] - qt[q]) ^ (qt[p + 1] - qt[p])) > 0) {
              f = 0;
              p = (p + 1) % r;
              s++;
            } else {
              q = (q + 1) % r;
            }
          } else {
            if (((qt[p + 1] - qt[p]) ^ (qt[q + 1] - qt[q])) > 0) {
              f = 1;
              q = (q + 1) % r;
            } else {
              p = (p + 1) % r;
              s++;
            }
          }
        }
      }
    }
  out:
    if (flag) {
      L = M;
    } else {
      R = M;
    }
  }
  printf("%.12f\n", L);
  return 0;
}
