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

#define ALL(x) (x).begin(),(x).end() 
#define EACH(i,c) for(auto i=(c).begin();i!=(c).end();++i)

typedef long long ll;
const double eps = 1e-10;

const double PI = atan(1) * 4;
// 大小比較用
int sgn(double a){
    return a < -eps ? -1: a > eps ? 1: 0;
}
int sgn(double a, double b){
    return sgn(b - a);
}
typedef complex<double> P;
typedef vector<P> Polygon;
#define curr(p,i) p[i]
#define next(p,i) p[(i+1)%p.size()]
struct Line : public vector<P> {
    Line(P a, P b) {
        push_back(a); push_back(b);
    }
};
struct Segment : public Line {
    Segment(const P &a, const P &b) : Line(a,b) { }
};
 
bool near(const P &a, const P &b){
    return !sgn(abs(a-b));
}
// sort用．ClosestPair用にX,Yに分けている
bool lessX(const P &a, const P &b){
    if(sgn(real(a), real(b))) return real(a) < real(b);
    if(sgn(imag(a), imag(b))) return imag(a) < imag(b);
    return false;
}
bool lessY(const P &a, const P &b){
    if(sgn(imag(a), imag(b))) return imag(a) < imag(b);
    if(sgn(real(a), real(b))) return real(a) < real(b);
    return false;
}
double dot(const P &a, const P &b){
    return real(conj(a) * b);
}
double cross(const P &a, const P &b){
    return imag(conj(a) * b);
}
int ccw(const P &a, P b, P c){
    assert(!near(a, b));
    b -= a; c -= a;
    if (sgn(cross(b, c)) > 0)        return +1;  // ccw
    if (sgn(cross(b, c)) < 0)        return -1;  // cw
    if (sgn(dot(b, c)) < 0)          return +2;  // c-a-b
    if (sgn(norm(b), norm(c)) > 0)   return -2;  // a-b-c
    return 0;                                   // a-c-b
}
bool parallel(const Line &s, const Line &t){
    return !sgn(abs(cross(s[1]-s[0], t[1]-t[0])));
}
bool orthogonal(const Line &s, const Line &t){
    return !sgn(abs(dot(s[1]-s[0], t[1]-t[0])));
}
// 点aの直線s上への射影
P projection(const Line &s, const P &a){
    P v = s[1] - s[0];
    return s[0] + dot(v, a - s[0]) / abs(v) / abs(v) * v;
}
// 直線sに対する点aの鏡映
P reflection(const Line &s, const P &a){
    P p = projection(s, a);
    return 2.0 * p - a;
}


Polygon convex_hull(vector<P> ps, int strict=1){
    int n = ps.size(), k = 0;
    sort(ALL(ps), lessX);
    Polygon qs(n*2);
    for(int i = 0; i < n; qs[k++] = ps[i++])
        while(k > 1 && (ccw(qs[k-2], qs[k-1], ps[i]) & 7) > 6-strict) --k;
    for(int i = n-2, t=k; i >= 0; qs[k++] = ps[i--])
        while(k>t && (ccw(qs[k-2],qs[k-1], ps[i]) & 7) > 6-strict) --k;
    qs.resize(k-1);
    return qs;
}

Line func(P a, P b) {
	P m = (a + b) * 0.5, v = (b - a) * P(0, 1);

	return Line(m, m + v);
}

void solve(long long N, vector<long long> x, vector<long long> y){
	vector<P> p(N);
	vector<double> res(N);
	for(int i = 0; i < N; ++i) {
		p[i] = P(x[i], y[i]);
	}

	Polygon Q = convex_hull(p);
	int M = Q.size();
	for(int i = 0; i < Q.size(); ++i) {
		P a = Q[(i + M - 1) % M], b = Q[i], c = Q[(i + 1) % M];

		Line l1 = func(b, a), l2 = func(c, b);
		P v = l1[1] - l1[0], u = l2[1] - l2[0];
		double d1 = atan2(v.imag(), v.real());
		double d2 = atan2(u.imag(), u.real());
		if(d2 < d1) d2 += 2 * PI;
		double ar = d2 - d1;
		for(int j = 0; j < N; ++j) {
			if(abs(b - p[j]) < eps) {
				res[j] = ar / (2 * PI);
			}
		}
	}

	for(int i = 0; i < N; ++i) {
		printf("%.10f\n", res[i]);
	}
}

int main(){	
	long long N;
	scanf("%lld",&N);
	vector<long long> y(N-1+1);
	vector<long long> x(N-1+1);
	for(int i = 0 ; i <= N-1 ; i++){
		scanf("%lld",&x[i]);
		scanf("%lld",&y[i]);
	}
	solve(N, x, y);
	return 0;
}



Measured memory_bytes: 256