#include<iostream>
#include<string>
#include<cstdio>
#include<vector>
#include<cmath>
#include<algorithm>
#include<functional>
#include<iomanip>
#include<queue>
#include<ciso646>
#include<random>
#include<map>
#include<set>
#include<complex>
#include<bitset>
#include<stack>
#include<unordered_map>
#include<utility>
using namespace std;
typedef long long ll;
typedef unsigned long long ul;
typedef unsigned int ui;
const ll mod = 1000000007;
typedef double ld;
typedef complex<ld> Point;
const ll INF = mod * mod;
typedef pair<int, int> P;
#define stop char nyaa;cin>>nyaa;
#define rep(i,n) for(int i=0;i<n;i++)
#define per(i,n) for(int i=n-1;i>=0;i--)
#define Rep(i,sta,n) for(int i=sta;i<n;i++)
#define rep1(i,n) for(int i=1;i<=n;i++)
#define per1(i,n) for(int i=n;i>=1;i--)
#define Rep1(i,sta,n) for(int i=sta;i<=n;i++)
const ld eps = 1e-6;
const ld pi = acos(-1.0);
typedef pair<ld, ld> LDP;
typedef pair<ll, ll> LP;

bool eq(ld a, ld b) {
	return (abs(a - b) < eps);
}
//内積
ld dot(Point a, Point b) {
	return real(conj(a)*b);
}
//外積
ld cross(Point a, Point b) {
	return imag(conj(a)*b);
}

//3点の位置関係
int ccw(Point a, Point b, Point c) {
	b -= a; c -= a;
	if (cross(b, c) > eps)return 1;//a,b,cが反時計回り
	if (cross(b, c) < -eps)return -1;//a,b,cが時計回り
	if (dot(b, c) < 0)return 2;//c,a,bの順に一直線
	if (norm(b) < norm(c))return -2;//a,b,cの順に一直線
	return 0;//a,c,bの順に一直線
}

//直線にするなら十分通い２点を端点とすればよい
class Line {
public:
	Point a, b;
};

//2直線の交差判定
bool isis_ll(Line l, Line m) {
	return !eq(cross(l.b - l.a, m.b - m.a), 0);
}

//直線と直線の交点
//平行な２直線に対しては使うな！！！！
Point is_ll(Line s, Line t) {
	Point sv = s.b - s.a; Point tv = t.b - t.a;
	return s.a + sv * cross(tv, t.a - s.a) / cross(tv, sv);
}

//点から直線への垂線の足
Point proj(Line l, Point p) {
	ld t = dot(p - l.a, l.a - l.b) / norm(l.a - l.b);
	return l.a + t * (l.a - l.b);
}

//直線と点の距離
ld dist_lp(Line l, Point p) {
	return abs(p - proj(l, p));
}

int n;
void solve() {
	vector<Point> v(n);
	rep(i, n) {
		ld x, y; cin >> x >> y;
		v[i] = { x,y };
	}
	v.push_back(v[0]);
	vector<Line> l(n);
	vector<LDP> d(n);
	rep(i, n) {
		l[i] = { v[i],v[i + 1] };
		ld dx = real(v[i + 1]) - real(v[i]);
		ld dy = imag(v[i + 1]) - imag(v[i]);
		ld r = pow(dx, 2) + pow(dy, 2); r = sqrt(r);
		d[i] = { dx / r,dy / r };
	}
	ld ans = 0;
	rep(i, n) {
		rep(j, n) {
			Rep(k, i+ 1, n) {
				if (i == j || j == k)continue;
				if (!isis_ll(l[i], l[j]) || !isis_ll(l[j], l[k]))continue;
				Point a = is_ll(l[i], l[j]), b = is_ll(l[j], l[k]);
				ld vx = (d[j].first - d[i].first) / 2.0;
				ld vy = (d[j].second - d[i].second) / 2.0;
				Point sa = { real(a) + vx,imag(a) + vy };
				vx = (d[k].first - d[j].first) / 2.0;
				vy = (d[k].second - d[j].second) / 2.0;
				Point sb = { real(b) + vx,imag(b) + vy };
				Line la = { a,sa }, lb = { b,sb };
				Point m = is_ll(la, lb);
				ld mi = INF;
				int cnt = 0;
				rep(x, n) {
					cnt += ccw(v[x], v[x + 1], m);
					mi = min(mi, dist_lp(l[x], m));
				}
				//cout << mi << endl;
				//ans = max(ans, mi);
				cnt = abs(cnt);
				if (cnt == n) {
					ans = max(ans, mi);
				}
			}
		}
	}
	cout << ans << endl;
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout << fixed << setprecision(9);
	while (cin >>n,n) {
		solve();
	}
	//stop
	return 0;
}


Measured memory_bytes: 3372