#include <bits/stdc++.h>

using namespace std;

const double EPS = 1e-8, PI = acos(-1);

inline bool eq(double a, double b) { return abs(b - a) < EPS; }

#define curr(P, i) P[i]
#define next(P, i) P[(i+1)%P.size()]
#define prev(P, i) P[(i+P.size()-1) % P.size()]
enum
{
  OUT, ON, IN
};
namespace Geometory
{
  struct Point
  {
    double x, y;

    Point() {};

    Point(double x, double y) : x(x), y(y) {};

    Point operator+(const Point &b) const { return Point(x + b.x, y + b.y); }

    Point operator-(const Point &b) const { return Point(x - b.x, y - b.y); }

    Point operator*(const double b) const { return Point(x * b, y * b); }

    Point operator*(const Point &b) const { return Point(x * b.x - y * b.y, x * b.y + y * b.x); }

    Point operator/(const double b) const { return Point(x / b, y / b); }

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

    bool operator==(const Point &b) const { return eq(x, b.x) && eq(y, b.y); }

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

    double arg() { return atan2(x, y); }

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

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

    Point rotate90() { return Point(-y, x); }

    friend ostream &operator<<(ostream &os, Point &p) { return os << "(" << p.x << "," << p.y << ")"; }

    friend istream &operator>>(istream &is, Point &a) { return is >> a.x >> a.y; }
  };

  struct Line
  {
    Point a, b;

    Line() {};

    Line(Point a, Point b) : a(a), b(b) {};

    friend ostream &operator<<(ostream &os, Line &p) { return os << "(" << p.a.x << "," << p.a.y << ") to (" << p.b.x << "," << p.b.y << ")"; }

    friend istream &operator>>(istream &is, Line &a) { return is >> a.a.x >> a.a.y >> a.b.x >> a.b.y; }
  };

  typedef vector< Point > Polygon;

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

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

  int ccw(const Point &a, Point b, Point c)
  {
    b = b - a, c = 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(b.norm() < c.norm()) return -2; // a -- b -- c???§??????´??????
    return 0;  // a -- c -- b???§??????´??????
  }

  Point Crosspoint(const Line &l, const Line &m)
  {
    double A = cross(l.b - l.a, m.b - m.a);
    double B = cross(l.b - l.a, l.b - m.a);
    if(abs(A) < EPS && abs(B) < EPS) return m.a; // same line
    return m.a + (m.b - m.a) * B / A;
  }

  Polygon Convex_Cut(Polygon &U, Line l)
  {
    Polygon ret;
    for(int i = 0; i < U.size(); i++) {
      Point now = curr(U, i), nxt = next(U, i);
      if(ccw(l.a, l.b, now) != -1) ret.push_back(now);
      if(ccw(l.a, l.b, now) * ccw(l.a, l.b, nxt) < 0) {
        ret.push_back(Crosspoint(Line(now, nxt), l));
      }
    }
    return (ret);
  }
};

using namespace Geometory;

Polygon data;

bool isable(double v)
{
  Polygon ret = data;
  for(int i = 0; i < data.size(); i++) {
    Point point = next(data, i) - curr(data, i);
    point = (point * v / point.abs()).rotate90();
    ret = Convex_Cut(ret, Line(curr(data, i) + point, next(data, i) + point));
  }
  return (!ret.empty());
}

int main()
{
  int N;
  cout << fixed << setprecision(10);
  while(cin >> N, N) {
    data.resize(N);
    for(int i = 0; i < N; i++) cin >> data[i];
    double low = 0, high = 1e4;
    for(int i = 0; i < 40; i++) {
      double mid = (low + high) * 0.5;
      if(isable(mid)) low = mid;
      else high = mid;
    }
    cout << low << endl;
  }

}

Measured memory_bytes: 3120