#include <bits/stdc++.h>
using namespace std;
pair<int, int> operator-(pair<int, int> a, pair<int, int> b) {
  return {a.first - b.first, a.second - b.second};
}
int distSquared(pair<int, int> a, pair<int, int> b) {
  pair<int, int> d = b - a;
  return d.first * d.first + d.second * d.second;
}
int cross(pair<int, int> a, pair<int, int> b) {
  return a.first * b.second - a.second * b.first;
}
int cross(pair<int, int> base, pair<int, int> a, pair<int, int> b) {
  return cross(a - base, b - base);
}
void radialSort(vector<pair<int, int>> &a) {
  size_t n = a.size();
  int ind = 0;
  pair<int, int> leftPoint = a[0];
  for (int i = 1; i < n; ++i) {
    if (a[i] < leftPoint) {
      ind = i;
      leftPoint = a[i];
    }
  }
  swap(a[ind], a[0]);
  sort(a.begin() + 1, a.end(),
       [&leftPoint](const pair<int, int> &a, const pair<int, int> &b) {
         pair<int, int> v1 = a - leftPoint;
         pair<int, int> v2 = b - leftPoint;
         int c = cross(v1, v2);
         return c == 0 ? v1.first == v2.first ? v1.second < v2.second
                                              : v1.first < v2.first
                       : c < 0;
       });
}
vector<pair<int, int>> getConvexHull(vector<pair<int, int>> a) {
  if (a.size() < 3) {
    return a;
  }
  size_t n = a.size();
  vector<pair<int, int>> hullStack{a[0]};
  for (int i = 1; i <= n; ++i) {
    if (i == n && hullStack.size() == 2) {
      break;
    }
    while (hullStack.size() > 1) {
      pair<int, int> n1 = hullStack.back(),
                     n2 = hullStack[hullStack.size() - 2];
      if (cross(a[i % n], n1, n2) > 0) {
        break;
      }
      hullStack.pop_back();
    }
    if (i != n) hullStack.emplace_back(a[i % n]);
  }
  return hullStack;
}
bool isEdgePairGood(pair<int, int> start1, pair<int, int> start2,
                    pair<int, int> end1, pair<int, int> end2) {
  pair<int, int> v1 = start2 - start1;
  pair<int, int> v2 = end2 - end1;
  return cross(v1, v2) <= 0;
}
int getCaliperDistance(vector<pair<int, int>> &hull) {
  if (hull.size() < 2) {
    return 0;
  }
  if (hull.size() == 2) {
    return distSquared(hull[0], hull[1]);
  }
  size_t n = hull.size();
  pair<int, int> bp1, bp2;
  int maxDist = 0;
  for (int i = 0, j = 1; i < n - 1; ++i) {
    while (
        isEdgePairGood(hull[i], hull[i + 1], hull[j % n], hull[(j + 1) % n])) {
      j = (j + 1) % (int)n;
    }
    j = (j + (int)n - 1) % (int)n;
    int dist1 = distSquared(hull[i], hull[(j + 1) % n]);
    int dist2 = distSquared(hull[i + 1], hull[(j + 1) % n]);
    int dist3 = distSquared(hull[i], hull[j]);
    int dist4 = distSquared(hull[i + 1], hull[j]);
    int dist = max({dist1, dist2, dist3, dist4});
    if (dist > maxDist) {
      maxDist = dist;
      if (dist1 == maxDist)
        bp1 = hull[i], bp2 = hull[(j + 1) % n];
      else if (dist2 == maxDist)
        bp1 = hull[i + 1], bp2 = hull[(j + 1) % n];
      else if (dist3 == maxDist)
        bp1 = hull[i], bp2 = hull[j];
      else if (dist4 == maxDist)
        bp1 = hull[i + 1], bp2 = hull[j];
    }
  }
  return maxDist;
}
bool isGuessValid(vector<pair<int, int>> &a, int r) {
  for (auto &p : a) {
    vector<pair<int, int>> goodPoints;
    for (auto &q : a) {
      if (p != q && distSquared(p, q) >= r) {
        goodPoints.push_back(q);
      }
    }
    vector<pair<int, int>> hull = getConvexHull(goodPoints);
    if (getCaliperDistance(hull) >= r) {
      return true;
    }
  }
  return false;
}
int solve(vector<pair<int, int>> &a, int n) {
  radialSort(a);
  int base = 0;
  for (int jump = 1e9; jump > 0; jump /= 2) {
    while (isGuessValid(a, base + jump)) {
      base += jump;
    }
  }
  return base;
}
int bruteForce(vector<pair<int, int>> &a, int n) {
  int mx = 0;
  for (int i = 2; i < n; ++i) {
    for (int j = 1; j < i; ++j) {
      for (int k = 0; k < j; ++k) {
        int d1 = distSquared(a[i], a[j]);
        int d2 = distSquared(a[j], a[k]);
        int d3 = distSquared(a[i], a[k]);
        mx = max(mx, min({d1, d2, d3}));
        cout << "";
      }
    }
  }
  return mx;
}
void printCase(vector<pair<int, int>> &a) {
  cout << a.size() << endl;
  for (auto &p : a) {
    cout << p.first << ' ' << p.second << endl;
  }
  cout << endl;
}
void runTests() {
  const int tests = 1000;
  const int n = 20;
  const int maxDist = 10;
  for (int test = 0; test < tests; ++test) {
    vector<pair<int, int>> a(n);
    for (int i = 0; i < n; ++i) {
      a[i].first = rand() % (maxDist * 2 + 1) - maxDist;
      a[i].second = rand() % (maxDist * 2 + 1) - maxDist;
    }
    int found = solve(a, n);
    int actual = bruteForce(a, n);
    if (found != actual) {
      cout << "Test case failed!" << endl;
      printCase(a);
      cout << "Found: " << found << endl;
      cout << "Actual: " << actual << endl;
      return;
    }
  }
  cout << "All test cases passed." << endl;
}
int main() {
  cout.precision(15);
  cout << fixed;
  int n;
  cin >> n;
  vector<pair<int, int>> a(n);
  for (int i = 0; i < n; ++i) {
    cin >> a[i].first >> a[i].second;
  }
  cout << sqrt((long double)solve(a, n)) / 2 << endl;
  return 0;
}
