#include <bits/stdc++.h>
using namespace std;
#define rep(i, n) for(int i = 0; i < n; i++)
#define rep2(i, x, n) for(int i = x; i <= n; i++)
#define rep3(i, x, n) for(int i = x; i >= n; i--)
#define elif else if
#define sp(x) fixed << setprecision(x)
#define pb push_back
#define eb emplace_back
#define all(x) x.begin(), x.end()
#define sz(x) (int)x.size()
using ll = long long;
using ld = long double;
using pii = pair<int, int>;
using pil = pair<int, ll>;
using pli = pair<ll, int>;
using pll = pair<ll, ll>;
const ll MOD = 1e9+7;
//const ll MOD = 998244353;
const int inf = (1<<30)-1;
const ll INF = (1LL<<60)-1;
const ld EPS = 1e-10;
template<typename T> bool chmax(T &x, const T &y) {return (x < y)? (x = y, true) : false;};
template<typename T> bool chmin(T &x, const T &y) {return (x > y)? (x = y, true) : false;};

//点(x, y)
struct P {
    ld x, y;
    P() {}
    P(ld x, ld y) : x(x), y(y) {}

    P &operator += (const P &p) {
        x += p.x, y += p.y;
        return *this;
    }

    P &operator -= (const P &p) {
        x -= p.x, y -= p.y;
        return *this;
    }

    P &operator *= (const ld &d) {
        x *= d, y *= d;
        return *this;
    }

    P &operator /= (const ld &d) {
        x /= d, y /= d;
        return *this;
    }

    P operator + (const P &p) const {return P (*this) += p;}

    P operator - (const P &p) const {return P (*this) -= p;}

    P operator * (const ld &d) const {return P(*this) *= d;}

    P operator / (const ld &d) const {return P(*this) /= d;}
  
  	bool operator == (const P &p) const {return abs(x-p.x) < EPS && abs(y-p.y) < EPS;}

    bool operator != (const P &p) const {return abs(x-p.x) >= EPS || abs(y-p.y) >= EPS;}

    ld norm() const {return sqrt(x*x+y*y);}

    ld norm2() const {return x*x+y*y;}
};

ld dist(P a, P b) {return (b-a).norm();}

ld dist2(P a, P b){return (b-a).norm2();}

ld dot(P a, P b) {return a.x*b.x+a.y*b.y;}

ld det(P a, P b) {return a.x*b.y-b.x*a.y;}

P mid(P a, P b) {return (a+b)/2;}

//点a,bをs:tに内分する点
P ind(P a, P b, ld s, ld t) {return (a*t+b*s)/(s+t);}

//点a,bをs:tに外分する点
P exd(P a, P b, ld s, ld t) {return ind(a, b, s, -t);}

//直線ax+by+c=0
struct L {ld a, b, c;};

//(x, y)を中心とする半径rの円
struct C {ld x, y, r;};

//直線l1と直線l2の交点
vector<P> l_l(L l1, L l2){
    vector<P> res;
    if(abs(l1.a*l2.b - l2.a*l1.b) < EPS) return res;
    ld x = (l2.c*l1.b-l1.c*l2.b)/(l1.a*l2.b-l2.a*l1.b);
    ld y = (l2.c*l1.a-l1.c*l2.a)/(l1.b*l2.a-l2.b*l1.a);
    res.pb(P(x, y));
    return res;
}

//直線lと円cの交点
vector<P> l_c(L l, C c){
    vector<P> res;
    if(l.a == 0 && l.b == 0) return res;
    //直線と円の中心の距離
    ld d = abs(l.a*c.x+l.b*c.y+l.c)/sqrt(l.a*l.a+l.b*l.b);
    if(d-c.r > EPS) return res;
    //hx,hy:=円の中心から直線に下ろした垂線の足の座標
    ld hx = -(l.a*l.c+l.b*(l.a*c.y-l.b*c.x))/(l.a*l.a+l.b*l.b);
    ld hy = -(l.b*l.c+l.a*(l.a*c.y-l.b*c.x))/(l.a*l.a+l.b*l.b);
    if(abs(d-c.r) < EPS){
        res.pb(P(hx, hy));
        return res;
    }
    //d2:=垂線の足hと交点の距離
    ld d2 = sqrt(c.r*c.r-d*d);
    //ex,ey:=直線と同じ向きの単位ベクトル
    ld ex = -l.b/sqrt(l.a*l.a+l.b*l.b), ey = l.a/sqrt(l.a*l.a+l.b*l.b);
    res.pb(P(hx+d2*ex, hy+d2*ey)), res.pb(P(hx-d2*ex, hy-d2*ey));
    return res;
}

//円c1と円c2の交点
vector<P> c_c(C c1, C c2){
    //直線ax+by+c=0:=２つの円の交点を通る直線
    ld a = 2*(c1.x-c2.x), b = 2*(c1.y-c2.y);
    ld c = -(c1.x*c1.x+c1.y*c1.y-c1.r*c1.r)+(c2.x*c2.x+c2.y*c2.y-c2.r*c2.r);
    L l = {a, b, c};
    return l_c(l, c1);
}

//点a,bを通る直線
L make_line(P a, P b){
    ld p = a.x, q = a.y, r = b.x, s = b.y;
    ld A = s-q, B = p-r, C = -p*s+q*r;
    L l = {A, B, C};
    return l;
}

//点a,bの垂直二等分線
L vertical_bisector(P a, P b){
    ld p = a.x, q = a.y, r = b.x, s = b.y;
    ld A = r-p, B = s-q, C = (p*p-r*r+q*q-s*s)/2;
    L l = {A, B, C};
    return l;
}

//点aから直線lに降ろした垂線の足
P foot(P a, L l){
    ld A = l.b, B = -l.a, C = l.a*a.y - l.b*a.x;
    L subl = {A, B, C};
    vector<P> p = l_l(l, subl);
    return p[0];
}

//点aがp1とp2を結ぶ線分上にあるかどうか
bool on_line(P a, P p1, P p2){
    P sub1 = p1-a, sub2 = p2-a;
    return (abs(det(sub1, sub2)) < EPS && dot(sub1, sub2) < EPS);
}

//x座標、y座標の小さい順にソート
bool comp_x(const P &p, const P &q){
    if(p.x != q.x) return p.x < q.x;
    return p.y < q.y;
}

//点の集合psの凸包を求める
vector<P> convex_hull(vector<P> ps){
    sort(all(ps), comp_x);
    int n = ps.size(), k = 0;
    vector<P> qs(2*n);
    //上側凸包を作成
    rep(i, n){
        while(k > 1 && det(qs[k-2]-qs[k-1], ps[i]-qs[k-1]) < EPS) k--;
        qs[k++] = ps[i];
    }
    int t = k;
    //下側凸包を作成
    rep3(i, n-2, 0){
        while(k > t && det(qs[k-2]-qs[k-1], ps[i]-qs[k-1]) < EPS) k--;
        qs[k++] = ps[i];
    }
    qs.resize(k-1);
    return qs;
}

int main(){
    ld pi = 3.14159265358979;
    int N;
    cin >> N;
    vector<P> ps;
    rep(i, N){
        ld x, y; cin >> x >> y;
        ps.pb(P(x, y));
    }
    vector<P> ch = convex_hull(ps);
    cout << sp(10);
    int n = sz(ch);
    if(n == 2){
      	rep(i, N){
            if(ps[i] == ch[0] || ps[i] == ch[1]) cout << 0.5 << endl;
            else cout << 0 << endl;
        }
      	return 0;
    }
    ld ans[N];
    rep(i, N) ans[i] = 0;
    rep(j, n){
        int i = (j+n-1)%n, k = (j+1)%n;
        P a = ch[i]-ch[j], b = ch[k]-ch[j];
        ld cos = dot(a, b)/(a.norm()*b.norm());
        ld the = pi-acos(cos);
        rep(l, N){
            if(ps[l] == ch[j]) ans[l] = the/(2*pi); 
        }
    }
    rep(i, N) cout << ans[i] << endl;
}

Measured memory_bytes: 256