#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ld = long double;
using pi = pair<int, int>;
using vi = vector<int>;
using si = set<int>;
const ld PI = acos(-1.l);
const vi dx = {1, 0, -1, 0}, dy = {0, 1, 0, -1};
mt19937 rng((uint32_t)chrono::steady_clock::now().time_since_epoch().count());
template <class T>
bool ckmin(T& a, const T& b) {
  return b < a ? a = b, 1 : 0;
}
template <class T>
bool ckmax(T& a, const T& b) {
  return a < b ? a = b, 1 : 0;
}
constexpr int pct(int x) { return __builtin_popcount(x); }
constexpr int bits(int x) { return 31 - __builtin_clz(x); }
template <class T>
void remDup(vector<T>& v) {
  sort(begin(v), end(v));
  v.erase(unique(begin(v), end(v)), end(v));
}
template <class A, class B>
void re(pair<A, B>& p);
template <class A>
void re(vector<A>& v);
template <class T>
void re(T& x) {
  cin >> x;
}
void re(ld& d) {
  string t;
  re(t);
  d = stold(t);
}
template <class H, class... T>
void re(H& h, T&... t) {
  re(h);
  re(t...);
}
template <class A, class B>
void re(pair<A, B>& p) {
  re(p.first, p.second);
}
template <class T>
void re(vector<T>& x) {
  for (auto& a : x) re(a);
}
string to_string(char c) { return string(1, c); }
string to_string(const char* s) { return (string)s; }
string to_string(string s) { return s; }
string to_string(bool b) { return to_string((int)b); }
template <class A, class B>
string to_string(pair<A, B> p);
template <class T>
string to_string(T v) {
  bool fst = 1;
  string res = "";
  for (const auto& x : v) {
    if (!fst) {
      res += " ";
    }
    fst = 0;
    res += to_string(x);
  }
  return res;
}
template <class A, class B>
string to_string(pair<A, B> p) {
  return to_string(p.first) + " " + to_string(p.second);
}
template <class T>
void pr(T x) {
  cout << to_string(x);
}
template <class H, class... T>
void pr(const H& h, const T&... t) {
  pr(h);
  pr(t...);
}
void ps() { pr("\n"); }
template <class H, class... T>
void ps(const H& h, const T&... t) {
  pr(h);
  if (sizeof...(t)) pr(" ");
  ps(t...);
}
void dbg() { cerr << "]" << '\n'; }
template <class H, class... T>
void dbg(H h, T... t) {
  cerr << to_string(h);
  if (sizeof...(t)) cerr << ", ";
  dbg(t...);
}
ld K(ld a) { return a * a; }
struct Point {
  ld x, y;
  friend void re(Point& p) { cin >> p.x >> p.y; }
  friend string to_string(Point p) {
    return "{" + to_string(p.x) + ", " + to_string(p.y) + "}";
  }
  Point operator+(Point b) { return Point{x + b.x, y + b.y}; }
  Point operator-(Point b) { return Point{x - b.x, y - b.y}; }
  Point operator*(ld mul) { return Point{x * mul, y * mul}; }
  ld operator*(Point b) { return x * b.y - y * b.x; }
  ld dot(Point b) { return x * b.x + y * b.y; }
  ld len() { return sqrt(K(x) + K(y)); }
  Point lenTo(ld to) { return *this * (to / len()); }
  ld dist(Point& b) { return (*this - b).len(); }
};
struct Line {
  Point one, two;
  ld dist(Point p) { return abs((p - one) * (p - two)) / one.dist(two); }
};
void solve() {
  int n;
  re(n);
  vector<Point> v(n);
  re(v);
  ld res = 1e15;
  for (int i = (0); i < (n); ++i) {
    int j = (i + 1) % n, k = (i + 2) % n;
    ckmin(res, Line{v[i], v[k]}.dist(v[j]));
  }
  cout << fixed << setprecision(10) << res / 2 << '\n';
}
int main() {
  ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  ll T = 1;
  while (T--) solve();
}
