#include <bits/stdc++.h>

#define _overload(_1,_2,_3,name,...) name
#define _rep(i,n) _range(i,0,n)
#define _range(i,a,b) for(int i=int(a);i<int(b);++i)
#define rep(...) _overload(__VA_ARGS__,_range,_rep,)(__VA_ARGS__)

using namespace std;
template<class T>void reg(vector<T> &ary,const T &elem){ary.emplace_back(elem);}

using R=long double; // __float128
const R EPS = 1E-14; // [-1000:1000]->EPS=1e-8 [-10000:10000]->EPS=1e-7
inline int sgn(const R& r){ return (r > EPS) - (r < -EPS);}
inline int sgn(const R& a, const R &b){ return sgn(a-b); }

using P=complex<R>;
using VP=vector<P>;
using L=struct{P s,t;};
using VL=vector<L>;

constexpr P O = P(0,0);
istream& operator >> (istream& is,P& p){ R x,y;is >> x >> y; p=P(x,y); return is;}


inline R dot(P o,P a,P b){a-=o,b-=o; return real(conj(a)*b);}
inline R det(P o,P a,P b){a-=o,b-=o; return imag(conj(a)*b);}

P cross(L a,L b){
	R s1=det(a.s,b.s,b.t);
	R s2=s1+det(a.t,b.t,b.s);
	return a.s+s1/s2*(a.t-a.s);
}

VP convex_cut(const VP& pol,const L& l) {
	VP res;
	int n=pol.size();
	rep(i,n){
		P a = pol[i],b=pol[(i+1)%n];
		if(det(l.s,l.t,a)>=0) reg(res,a);
		if(det(l.s,l.t,a)*det(l.s,l.t,b)<0) reg(res,cross({a,b},l));
	}
	return res;
}

R area(const VP& pol){
	int n=pol.size();
	R sum=0;
	rep(i,n) sum+=det(O,pol[i],pol[(i+1)%n]);
	return abs(sum/2.0);
}

bool check(VP pol,R len){
	int n=pol.size();
	VL lines(n);

	rep(i,n){
		P e=(pol[(i+1)%n]-pol[i])/abs(pol[(i+1)%n]-pol[i])*P(0,1);
		lines[i]=L({pol[i]+e*len,pol[(i+1)%n]+e*len});
	}

	VP cur=pol;
	rep(i,n) cur=convex_cut(cur,lines[i]);
	return sgn(area(cur));
}

int main(void){
	int n;
	while(cin >> n,n){
		VP pol(n);
		rep(i,n) cin >> pol[i];

		R lb=0.0,ub=20000.0;

		rep(loop,200){
			const R mid=(lb+ub)/2.0;
			if(check(pol,mid))
				lb=mid;
			else
				ub=mid;
		}

		cout.precision(20);
		cout << fixed << lb << endl;
	}
	return 0;
}