#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
#include <queue>
#include <string>
#include <map>
#include <set>
#include <tuple>
#include <deque>
#include <numeric>
#include <bitset>
#include <iomanip>
#include <cassert>
#include <chrono>
#include <random>
#include <limits>
#include <iterator>
#include <functional>
#include <sstream>
#include <complex>
using namespace std;

typedef long long ll;
typedef pair<int, int> P;
typedef pair<int, double> Pid;
typedef pair<double, int> Pdi;
typedef pair<ll, int> Pl;
typedef pair<int, pair<int, int>> PP;
const double PI = 3.1415926535897932;   // acos(-1)
const double EPS = 1e-15;
const int INF = 1001001001;
const int mod = 1e+9 + 7;

#define chmax(x, y) x = max(x, y)
#define chmin(x, y) x = min(x, y)
#define chadd(x, y) x = (x + y) % mod

using ld = long double;
using Point = complex<ld>;
using Set = vector<Point>;
const ld pi = acos(-1);
const ld eps = 1e-10;
const ld inf = 1e12;

// 外積
ld cross(const Point& a, const Point& b){
    return a.real() * b.imag() - a.imag() * b.real();
}

// 内積
ld dot(const Point& a, const Point& b){
    return a.real() * b.real() + a.imag() * b.imag();
}

enum CCW_RESULT{
    CCW = +1, CW = -1, BEHIND = +2, FRONT = -2, ON = 0
};
// a, b に対して、c がどの位置にあるか
int ccw(Point a, Point b, Point c){
    b -= a, c -= a;
    if(cross(b, c) > eps)   return CCW;     // 上側
    if(cross(b, c) < -eps)  return CW;      // 下側
    
    // cross(b, c) == 0
    if(dot(b, c) < 0)   return BEHIND;      // 同一直線上の左側
    if(norm(b) < norm(c))   return FRONT;   // 同一直線上の右側
    return ON;      // 線分 ab 上にある
}

bool operator<(const Point& a, const Point &b){
    return abs(real(a) - real(b)) > eps ? real(a) < real(b) : imag(a) < imag(b);
}

// 直線
struct Line : public vector<Point>{
    Line(const Point& a = Point(), const Point& b = Point()) : vector<Point>(2){
        begin()[0] = a;
        begin()[1] = b;
    }

    // Ax + By + C = 0
    Line(ld A, ld B, ld C){
        if(abs(A) < eps && abs(B) < eps){
            abort();
        }
        else if(abs(A) < eps){
            *this = Line(Point(0, -C / B), Point(1, -C / B));
        }
        else if(abs(B) < eps){
            *this = Line(Point(-C / A, 0), Point(-C / A, 1));
        }
        else{
            *this = Line(Point(0, -C / B), Point(-C / A, 0));
        }
    }
};

// 円
struct Circle{
    Point center;   // 中心座標
    ld radius;      // 半径
    Circle(const Point& p = 0, ld r = 0) : center(p), radius(r) {}
};


int n;
vector<Point> ps(n);

// 中心 (x, y) を固定したときの最遠点との距離 (の二乗) を返す
ld distance(const Point& p){
    ld res = 0;
    for(int i = 0; i < n; ++i){
        chmax(res, norm(p - ps[i]));
    }
    return res;
}

// x 座標を固定したとき、三分探索で y 座標を動かして、包含円の距離が最小のものを返す
ld search_y(const ld& x){
    ld low = -1000, high = 1001;
    for(int i = 0; i < 200; ++i){
        ld y1 = (low * 2 + high) / (ld)3;
        ld y2 = (low + high * 2) / (ld)3;
        Point p1 = Point(x, y1), p2 = Point(x, y2);
        if(distance(p1) > distance(p2)) low = y1;
        else    high = y2;
    }
    return distance(Point(x, low));
}

// 三分探索で x 座標を動かして、最小包含円の半径の二乗を返す
ld min_radius(){
    ld left = -1000, right = 1001;
    for(int i = 0; i < 200; ++i){
        ld x1 = (left * 2 + right) / (ld)3;
        ld x2 = (left + right * 2) / (ld)3;
        if(search_y(x1) > search_y(x2)) left = x1;
        else    right = x2;
    }
    return search_y(left);
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    cin >> n;
    ps.resize(n);
    for(int i = 0; i < n; ++i){
        ld x, y;
        cin >> x >> y;
        ps[i] = Point(x, y);
    }

    cout << fixed << setprecision(18);
    ld res = min_radius();
    cout << sqrt(res) << endl;
}

Measured memory_bytes: 384