#define _USE_MATH_DEFINES
#define _CRT_SECURE_NO_WARNINGS
#include <bits/stdc++.h>
using namespace std;

/*BigInteger
#include <boost/multiprecision/cpp_dec_float.hpp>
#include <boost/multiprecision/cpp_int.hpp>
#include <boost/rational.hpp>
namespace xxx = boost::multiprecision;
using Bint = xxx::cpp_int;
using Real = xxx::number<mp::cpp_dec_float<1024>>;
*/

#define int long long
#define pb(x) push_back(x)
#define m0(x) memset((x), 0, sizeof(x))
#define mm(x) memset((x), -1, sizeof(x))

//container
#define ALL(x) (x).begin(), (x).end()
#define RALL(a) (a).rbegin(), (a).rend()
#define EACH(i, c) for (typeof((c).begin()) i = (c).begin(); i != (c).end(); ++i)
#define EXIST(s, e) ((s).find(e) != (s).end())
#define UNIQUE(v) (v).erase(unique((v).begin(), (v).end()), (v).end());
#define PERM(c) \
  sort(ALL(c)); \
  for (bool c##p = 1; c##p; c##p = next_permutation(ALL(c)))

// debug
#define GET_VAR_NAME(variable) #variable
#define test(x) cout << GET_VAR_NAME(x) << " = " << x << endl;

// bit_macro
#define bit(n) (1LL << (n))
#define bitset(a, b) (a) |= (1 << (b))
#define bitunset(a, b) (a) &= ~(1 << (b))
#define bitcheck(a, b) ((((a) >> (b)) & 1) == 1)
#define bitcount(a) __builtin_popcountll((a))

//typedef
typedef long long lint;
typedef unsigned long long ull;
typedef complex<long double> Complex;
typedef pair<int, int> P;
typedef tuple<int, int, int> TP;
typedef vector<int> vec;
typedef vector<vec> mat;

//constant
const int INF = (int)1e18;
const int MOD = (int)1e9 + 7;
const double PI = (double)acos(-1);
const double EPS = (double)1e-10;
const int dx[] = {-1, 0, 0, 1, 0, -1, -1, 1, 1};
const int dy[] = {0, -1, 1, 0, 0, 1, -1, 1, -1};

//
template <typename T>
void chmax(T &a, T b) { a = max(a, b); }
template <typename T>
void chmin(T &a, T b) { a = min(a, b); }
//
inline int toInt(string s) {
  int v;
  istringstream sin(s);
  sin >> v;
  return v;
}
template <class T>
inline string toString(T x) {
  ostringstream sout;
  sout << x;
  return sout.str();
}

//
struct Accelerate_Cin {
  Accelerate_Cin() {
    cin.tie(0);
    ios::sync_with_stdio(0);
    cout << fixed << setprecision(20);
  };
};

//幾何学テンプレート

#define equals(a, b) (fabs((a) - (b)) < EPS)

//点
class Point {
public:
  double x, y;

  Point(double x = 0, double y = 0) : 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); }

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

  bool operator<(const Point &p) const { return x != p.x ? x < p.x : y < p.y; }
  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;
  }
};

//ベクトル
typedef Point Vector;

double norm(Vector a) { return a.x * a.x + a.y * a.y; }
double abs(Vector a) { return sqrt(norm(a)); }
//内積
double dot(Vector a, Vector b) { return a.x * b.x + a.y * b.y; }
//外積
double cross(Vector a, Vector b) { return a.x * b.y - a.y * b.x; }
//角度
double arg(Vector p, Vector q) { return acos(dot(p, q) / (abs(p) * abs(q))); }
//極座標:原点からの距離a,角度r[rad]
Vector polar(double a, double r) { return Point(cos(r) * a, sin(r) * a); }
//回転:r倍、angle[rad]回転
Vector rotate(Vector v, double r, double angle) {
  return Vector((cos(angle) - sin(angle)) * v.x * r,
                (sin(angle) - cos(angle)) * v.y * r);
}

//線分
struct Segment {
  Point p1, p2;
};

//直線
typedef Segment Line;

//円
class Circle {
public:
  Point c;  //中心
  double r; //半径
  Circle(Point c = Point(), double r = 0.0) : c(c), r(r) {}
};

//多角形
typedef vector<Point> Polygon;

//計算量Ｏ(n logn)
//凸包を求める。

// 3点の位置関係を調べる。

static const int COUNTER_CLOCKWISE = 1;
static const int CLOCKWISE = -1;
static const int ONLINE_BACK = 2;
static const int ONLINE_FRONT = -2;
static const int ON_SEGMENT = 0;

int ccw(Point p0, Point p1, Point p2) {
  Vector a = p1 - p0;
  Vector 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 (a.norm() < b.norm())
    return ONLINE_FRONT;

  return ON_SEGMENT;
}

Polygon andrewScan(Polygon s) {
  Polygon u, l;
  if (s.size() < 3)
    return s;
  sort(s.begin(), s.end()); // x,yを基準にsort
  //ｘが小さいものから２つ追加
  u.push_back(s[0]);
  u.push_back(s[1]);
  // xが大きいものから２つ追加
  l.push_back(s[s.size() - 1]);
  l.push_back(s[s.size() - 2]);

  //凸包の上部を作成。
  for (int i = 2; i < s.size(); i++) {
    //＜！！！！！注意！！！！！＞凸包の辺上の点も含めるときは↓　！＝を＝＝に変更する。
    for (int n = u.size(); n >= 2 && ccw(u[n - 2], u[n - 1], s[i]) == CLOCKWISE;
         n--) {
      u.pop_back();
    }
    u.push_back(s[i]);
  }

  //凸包の下部を作成。
  for (int i = s.size() - 3; i >= 0; i--) {
    //＜！！！！！注意！！！！！＞凸包の辺上の点も含めるときは↓　！＝を＝＝に変更する。
    for (int n = l.size(); n >= 2 && ccw(l[n - 2], l[n - 1], s[i]) == CLOCKWISE;
         n--) {
      l.pop_back();
    }
    l.push_back(s[i]);
  }

  //反時計回りになるように凸包の点の列を生成。
  reverse(l.begin(), l.end());
  for (int i = u.size() - 2; i >= 1; i--)
    l.push_back(u[i]);

  return l;
}

int N;
Polygon p, tmp;
map<Point, int> mp;

signed main() {
  cin >> N;
  for (int i = 0; i < N; i++) {
    double x, y;
    cin >> x >> y;
    tmp.push_back(Point(x, y));
    mp[Point(x, y)] = i;
  }

  if (N < 3) {
    cout << 0.5 << endl;
    cout << 0.5 << endl;
    return 0;
  }

  Polygon x = andrewScan(tmp);

  for (int i = 0; i < x.size() - 1; i++) {
    Point z = Point((x[i].x - x[i + 1].x), (x[i].y - x[i + 1].y));
    p.push_back(z);
  }
  Point z = Point((x[x.size() - 1].x - x[0].x), (x[x.size() - 1].y - x[0].y));
  p.push_back(z);

  vector<double> ans(N, 0.0);

  for (int i = 0; i < p.size() - 1; i++) {
    ans[mp[x[i + 1]]] = (arg(p[i], p[i + 1])) / (2 * PI);
  }
  ans[mp[x[0]]] = (arg(p[p.size() - 1], p[0])) / (2 * PI);

  for (auto v : ans) cout << fixed << setprecision(12) << v << endl;
  return 0;
}


Measured memory_bytes: 512