#include <bits/stdc++.h>
using namespace std;
inline int _Int() {
  int x;
  scanf("%d", &x);
  return x;
}
long long int bigMod(long long int A, long long int P, int M) {
  long long int R = 1;
  for (A %= M; P; P >>= 1) {
    if (P & 1) R = (R * A) % M;
    A = (A * A) % M;
  }
  return R;
}
long long int bigMul(long long int A, long long int B, long long int M) {
  long long int R = 0;
  for (A %= M; B; B >>= 1) {
    if (B & 1) R = (R + A) % M;
    A = (A + A) % M;
  }
  return R;
}
long long int negMod(long long int A, long long int B) {
  return (((A % B) + B) % B);
}
long long int invMod(long long int A, long long int M) {
  return bigMod(A, M - 2, M);
}
unsigned long long int _pow(unsigned long long int A, int P) {
  unsigned long long int R = 1;
  for (; P; P >>= 1) {
    if (P & 1) R = (R * A);
    A = (A * A);
  }
  return R;
}
template <class T>
T GCD(T x, T y) {
  while (x) x ^= y ^= x ^= y %= x;
  return y;
}
template <class T>
bool inRng(T u, T v, T x) {
  return u <= x && x <= v;
}
double EPS = 1e-7;
bool isEqual(double a, double b) { return (max(a, b) - min(a, b)) < EPS; }
bool inRange(double from, double key, double to) {
  return from <= key && key <= to;
}
struct Point {
  double x, y;
  Point() {}
  Point(double X, double Y) { x = X, y = Y; }
  Point operator+(const Point &p) const { return Point(x + p.x, y + p.y); }
  Point operator-(const Point &p) const { return Point(x - p.x, y - p.y); }
  Point operator*(double c) const { return Point(x * c, y * c); }
  Point operator/(double c) const { return Point(x / c, y / c); }
  bool operator<(const Point &R) const {
    return (x == R.x) ? (y < R.y) : (x < R.x);
  }
  double dist(Point &b) {
    return sqrt((x - b.x) * (x - b.x) + (y - b.y) * (y - b.y));
  }
  bool operator==(const Point &p) const {
    return isEqual(x, p.x) && isEqual(y, p.y);
  }
};
ostream &operator<<(ostream &os, const Point &p) {
  os << "( " << p.x << " , " << p.y << " )";
}
struct Vector {
  double x, y;
  Vector() {}
  Vector(Point a, Point b) { x = b.x - a.x, y = a.y - b.y; }
  Vector(double X, double Y) { x = X, y = Y; }
  Vector operator+(const Vector &Ref) const {
    return Vector(x + Ref.x, y + Ref.y);
  }
  Vector operator-(const Vector &Ref) const {
    return Vector(x - Ref.x, y - Ref.y);
  }
  bool operator==(const Vector &Ref) const {
    return isEqual(x, Ref.x) && isEqual(y, Ref.y);
  }
  Point endPoint(Point P) { return Point(x + P.x, P.y - y); }
  double magnitude() { return sqrt(x * x + y * y); }
  double dot(Vector &B) { return x * B.x + y * B.y; }
  double cross(Vector &B) { return x * B.y - y * B.x; }
  double angleClockwise(Vector &B) {
    double dot = this->x * B.x + this->y * B.y;
    double det = this->x * B.y - this->y * B.x;
    double angle = atan2(det, dot) * (180.0 / acos(-1));
    if (angle < 0) return 360.00 + angle;
    return angle;
  }
  Vector rotate(double theta) {
    Vector Ret;
    double ct = cos(theta * (acos(-1) / 180));
    double st = sin(theta * (acos(-1) / 180));
    Ret.x = x * ct - y * st;
    Ret.y = x * st + y * ct;
    return Ret;
  }
};
double linePointDist(Point a, Point b, Point p, bool isSegment) {
  Vector AB(a, b), BP(b, p), BA(b, a), AP(a, p);
  if (isSegment) {
    if (BA.cross(AP) > 0.00) return a.dist(p);
    if (AB.cross(BP) > 0.00) return b.dist(p);
  }
  return fabs(AB.cross(BP) / AB.magnitude());
}
int n;
Point P[1000 + 7];
void Main() {
  n = _Int();
  for (int i = 0; i < n; i++) {
    P[i].x = _Int();
    P[i].y = _Int();
  }
  double high = 1234687981321654L;
  for (int i = 0; i < n; i++) {
    for (int j = i + 1; j < n; j++) {
      high = min(high, P[i].dist(P[j]) / 2.00);
    }
  }
  for (int i = 0; i < n; i++) {
    int j = (i + 1) % n, k = (i + 2) % n;
    double d = linePointDist(P[i], P[k], P[j], 0);
    high = min(high, d / 2.00);
  }
  printf("%0.8f\n", high);
  return;
}
int main() {
  Main();
  return 0;
}
