#include <bits/stdc++.h>
using namespace std;
int n;
pair<int, int> p[3002];
vector<pair<int, int> > lista;
int u;
int d;
vector<pair<int, int> > hull;
vector<pair<int, int> > up;
vector<pair<int, int> > down;
bool turn(pair<int, int> a, pair<int, int> b, pair<int, int> c) {
  pair<int, int> x;
  x.first = c.first - a.first;
  x.second = c.second - a.second;
  pair<int, int> y;
  y.first = b.first - a.first;
  y.second = b.second - a.second;
  return x.first * y.second - x.second * y.first < 0;
}
pair<int, int> vect(pair<int, int> a, pair<int, int> b) {
  return make_pair(b.first - a.first, b.second - a.second);
}
long long cross(pair<int, int> a, pair<int, int> b) {
  return (long long)a.first * b.second - (long long)a.second * b.first;
}
int sgn(long long a) {
  if (a > 0) return 1;
  if (a < 0) return -1;
  return 0;
}
void convexhull() {
  int size = lista.size();
  for (int i = 0; i < size; i++) {
    while (u > 2 && sgn(cross(vect(up[u - 2], up[u - 1]),
                              vect(up[u - 2], lista[i]))) != -1)
      u--;
    up[u++] = lista[i];
  }
  for (int i = size - 1; i >= 0; i--) {
    while (d > 2 && sgn(cross(vect(down[d - 2], down[d - 1]),
                              vect(down[d - 2], lista[i]))) != -1)
      d--;
    down[d++] = lista[i];
  }
}
long long dist(pair<int, int> a, pair<int, int> b) {
  return (long long)(b.first - a.first) * (b.first - a.first) +
         (long long)(b.second - a.second) * (b.second - a.second);
}
long long rotatingcalipers() {
  int k = 0;
  long long res = 0;
  for (int i = 0; i < up.size(); i++) {
    while (k != down.size() - 1 &&
           dist(up[i], down[k + 1]) > dist(up[i], down[k])) {
      k++;
      res = max(res, dist(up[i], down[k]));
    }
  }
  return res;
}
void alternative() {
  up.clear();
  down.clear();
  for (int j = 0; j < lista.size(); j++) {
    if (up.size() < 2) {
      up.push_back(lista[j]);
      continue;
    }
    while (up.size() > 1 &&
           sgn(cross(vect(up[up.size() - 2], up[up.size() - 1]),
                     vect(up[up.size() - 2], lista[j]))) != -1) {
      up.pop_back();
    }
    up.push_back(lista[j]);
  }
  for (int j = lista.size() - 1; j >= 0; j--) {
    if (down.size() < 2) {
      down.push_back(lista[j]);
      continue;
    }
    while (down.size() > 1 &&
           sgn(cross(vect(down[down.size() - 2], down[down.size() - 1]),
                     vect(down[down.size() - 2], lista[j]))) != -1) {
      down.pop_back();
    }
    down.push_back(lista[j]);
  }
}
int main() {
  cin >> n;
  for (int i = 0; i < n; i++) cin >> p[i].first >> p[i].second;
  long long ini = 0;
  long long fin = 21000 * 21000;
  sort(p, p + n);
  while (fin - ini > 1) {
    long long middle = (ini + fin) / 2;
    bool t = false;
    for (int i = n - 1; i >= 0; i--) {
      lista.clear();
      u = d = 0;
      for (int j = 0; j < n; j++) {
        if (dist(p[i], p[j]) >= middle) lista.push_back(p[j]);
      }
      alternative();
      int kde = 0;
      for (int i = 0; i < up.size(); i++) {
        while (kde != down.size() - 1 &&
               dist(up[i], down[kde + 1]) > dist(up[i], down[kde])) {
          kde++;
        }
        if (dist(up[i], down[kde]) >= middle) {
          t = true;
        }
        if (t) break;
      }
      if (t) break;
    }
    if (t)
      ini = middle;
    else
      fin = middle;
  }
  printf("%.9lf\n", sqrt(ini / 4.0));
  return 0;
}
