#include<iostream>
#include<vector>
#include<algorithm>
#include<cmath>
#include<iomanip>
#include<cassert>
#include<complex>

#define REP(i,s,n) for(int i=s;i<n;i++)
#define rep(i,n) REP(i,0,n)
#define inf (1<<29)
#define EPS (1e-10)
#define equals(a,b) (fabs((a)-(b)) < EPS)
#define all(n) (n).begin(),(n).end()
#define COUNTER_CLOCKWISE 1
#define CLOCKWISE -1 
#define ONLINE_BACK 2
#define ONLINE_FRONT -2
#define ON_SEGMENT 0

using namespace std;

//---------------

class Point
{
  public:
  double x,y;

  Point(double x = -1,double y = -1): x(x),y(y){}

  Point operator + (Point p ){return Point(x+p.x,y+p.y);}
  Point operator - (Point p){return Point(x-p.x,y-p.y);}
  Point operator * (double a){return Point(a*x,a*y);}
  Point operator / (double a){return Point(x/a,y/a);}//※イケメンに限る

  bool operator < (const Point& p) const
  {
    return x != p.x?x<p.x:y<p.y;
  }

  bool operator == (const Point& p)const
  {
    return fabs(x-p.x) < EPS && fabs(y-p.y) < EPS;
  }

};

struct Segment
{
  Point p1,p2;
  Segment(Point p1 = Point(-1,-1),Point p2 = Point(-1,-1)):p1(p1),p2(p2){}
};
typedef Point Vector;
typedef Segment Line;
typedef vector<Point> Polygon;

double dot(Point a,Point b){ return a.x*b.x + a.y*b.y; }

double cross(Point a,Point b){ return a.x*b.y - a.y*b.x;}

double norm(Point a){ return a.x*a.x+a.y*a.y;}

double abs(Point a){return sqrt(norm(a));}

bool pequals(Point a,Point b){ return equals(a.x,b.x) && equals(a.y,b.y); }

Point rotate(Point a,double rad){ return Point(cos(rad)*a.x - sin(rad)*a.y,sin(rad)*a.x + cos(rad)*a.y); }

double toRad(double agl){ return agl*M_PI/180.0; }

int ccw(Point p0,Point p1,Point p2)
{
  Point a = p1-p0;
  Point b = p2-p0;
  if(cross(a,b) > EPS)return COUNTER_CLOCKWISE;
  if(cross(a,b) < -EPS)return CLOCKWISE;
  if(dot(a,b) < -EPS)return ONLINE_BACK;
  if(norm(a) < norm(b))return ONLINE_FRONT;
  return ON_SEGMENT;
}


Segment slideSeg(Segment seg,double r)
{
  Point p = (seg.p2-seg.p1)*r/abs(seg.p2-seg.p1);
  p = rotate(p,toRad(90.0));
  seg = Segment(seg.p1+p,seg.p2+p);
  if(fabs(seg.p1.x) < EPS)seg.p1.x = 0;
  if(fabs(seg.p1.y) < EPS)seg.p1.y = 0;
  if(fabs(seg.p2.x) < EPS)seg.p2.x = 0;
  if(fabs(seg.p2.y) < EPS)seg.p2.y = 0;
  return seg;
}

Point getCrossPointLines( Line s1, Line s2){
    Point a = s1.p2 - s1.p1;
    Point base = Point(s2.p2.x - s2.p1.x,s2.p2.y - s2.p1.y);
    return s1.p1 + a * (cross(base, s2.p1 - s1.p1)/cross(base, a));
}

Polygon cutPolygon( Polygon P, Line l ){
    Polygon u;
    for ( int i = 0; i < P.size(); i++ ){
        Point a = P[i], b = P[(i+1)%P.size()];
        if ( ccw(l.p1, l.p2, a) != CLOCKWISE ) u.push_back(a);
        if ( ccw(l.p1, l.p2, a) * ccw(l.p1, l.p2, b) == -1 ){
      u.push_back(getCrossPointLines(Segment(a, b), l));
        }
    }
    return u;
}


//---------------

int n;

bool check(vector<Point> ps,double d)
{
  Polygon poly = ps;
  rep(i,n)
    {
      Segment seg = Segment(ps[i],ps[(i+1)%n]);
      seg = slideSeg(seg,d);
      poly = cutPolygon(poly,seg);
    }
  return poly.empty();
}

int main()
{
  while(cin >> n,n)
    {
      vector<Point> ps(n);
      rep(i,n)cin >> ps[i].x >> ps[i].y;

      double L,R,M;
      L = 0;
      R = inf;
      rep(_,100)
	{
	  M = (L+R)*0.5;
	  if(check(ps,M))R = M;
	  else           L = M;
	}

      cout << setiosflags(ios::fixed) << setprecision(10) << M << endl;

    }
  return 0;
}

Measured memory_bytes: 1308