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

#define DEBUG(x) cout<<#x<<": "<<x<<endl;
#define DEBUG_VEC(v) cout<<#v<<":";for(int i=0;i<v.size();i++) cout<<" "<<v[i]; cout<<endl

typedef long long ll;
#define vi vector<int>
#define vl vector<ll>
#define vii vector< vector<int> >
#define vll vector< vector<ll> >
#define vs vector<string>
#define pii pair<int,int>
#define pis pair<int,string>
#define psi pair<string,int>
#define pll pair<ll,ll>
#define fi first
#define se second
#define rep(i,n) for(int i=0;i<(int)(n);i++)
#define rep1(i,n) for(int i=1;i<=(int)(n);i++)
#define all(c) c.begin(),c.end()
const int inf = 1000000001;
const ll INF = 2e18;
#define MOD 1000000007
#define mod 1000000009
#define pi 3.14159265358979323846
#define Sp(p) cout<<setprecision(15)<< fixed<<p<<endl;
int dx[4] = { 1,0,-1,0 }, dy[4] = { 0,1,0,-1 };
int dx2[8] = { 1,1,0,-1,-1,-1,0,1 }, dy2[8] = { 0,1,1,1,0,-1,-1,-1 };

#define ci complex<ll>
//x,yの順に辞書順ソート
bool cmp_x(const ci p, const ci q) {
	if (p.real() != q.real()) return p.real() < q.real();
	return p.imag() < q.imag();
}

//位置ベクトルa,bの外積
ll det(ci a, ci b) {
	return a.real()*b.imag() - b.real()*a.imag();
}

//位置ベクトルa,bの内積
ll dot(ci a, ci b) {
	return a.real()*b.real() + a.imag()*b.imag();
}


//ps: 全部の座標, n: 座標数。凸包の集合を返す
vector<ci> convex_hull(vector<ci> ps, int n) {
	sort(ps.begin(), ps.end(), cmp_x);
	int k = 0; //凸包の頂点数
	vector<ci> qs(n * 2); //構築中の凸包
	for (int i = 0; i < n; i++) {
		while (k > 1 && det(qs[k - 1] - qs[k - 2], ps[i] - qs[k - 1]) <= 0) k--;
		qs[k++] = ps[i];
	}
	for (int i = n - 2, t = k; i >= 0; i--) {
		while (k > t && det(qs[k - 1] - qs[k - 2], ps[i] - qs[k - 1]) <= 0) k--;
		qs[k++] = ps[i];
	}
	qs.resize(k - 1);
	return qs;
}


#define P complex<double>

// 許容する誤差ε
#define EPS (1e-10)
// 2つのスカラーが等しいかどうか
#define EQ(a,b) (abs((a)-(b)) < EPS)
// 2つのベクトルが等しいかどうか
#define EQV(a,b) ( EQ((a).real(), (b).real()) && EQ((a).imag(), (b).imag()) )

/*
// ベクトルaの絶対値を求める
double length = abs(a);

// 2点a,b間の距離を求める
double distance = abs(a-b);

// ベクトルaの単位ベクトルを求める
P b = a / abs(a);

// ベクトルaの法線ベクトルn1,n2を求める
P n1 = a * P(0, 1);
P n2 = a * P(0, -1);
// ベクトルaの単位法線ベクトルun1,un2を求める
P un1 = (a * P(0, +1)) / abs(a);
P un2 = (a * P(0, -1)) / abs(a);
*/

// 内積 (dot product) : a・b = |a||b|cosΘ
double dot(P a, P b) {
	return (a.real() * b.real() + a.imag() * b.imag());
}

// 外積 (cross product) : a×b = |a||b|sinΘ
double cross(P a, P b) {
	return (a.real() * b.imag() - a.imag() * b.real());
}

// 2直線の直交判定 : a⊥b <=> dot(a, b) = 0
int is_orthogonal(P a1, P a2, P b1, P b2) {
	return EQ(dot(a1 - a2, b1 - b2), 0.0);
}

// 2直線の平行判定 : a//b <=> cross(a, b) = 0
int is_parallel(P a1, P a2, P b1, P b2) {
	return EQ(cross(a1 - a2, b1 - b2), 0.0);
}

// 点cが直線a,b上にあるかないか
int is_point_on_line(P a, P b, P c) {
	return EQ(cross(b - a, c - a), 0.0);
}

// 点cが線分a,b上にあるかないか
int is_point_on_lines(P a, P b, P c) {
	// |a-c| + |c-b| <= |a-b| なら線分上
	return (abs(a - c) + abs(c - b) < abs(a - b) + EPS);
}

// 点a,bを通る直線と点cとの距離
double distance_l_p(P a, P b, P c) {
	return abs(cross(b - a, c - a)) / abs(b - a);
}

// 点a,bを端点とする線分と点cとの距離
double distance_ls_p(P a, P b, P c) {
	if (dot(b - a, c - a) < EPS) return abs(c - a);
	if (dot(a - b, c - b) < EPS) return abs(c - b);
	return abs(cross(b - a, c - a)) / abs(b - a);
}

// a1,a2を端点とする線分とb1,b2を端点とする線分の交差判定
int is_intersected_ls(P a1, P a2, P b1, P b2) {
	return (cross(a2 - a1, b1 - a1) * cross(a2 - a1, b2 - a1) < EPS) &&
		(cross(b2 - b1, a1 - b1) * cross(b2 - b1, a2 - b1) < EPS);
}

// a1,a2を端点とする線分とb1,b2を端点とする線分の交点計算
P intersection_ls(P a1, P a2, P b1, P b2) {
	P b = b2 - b1;
	double d1 = abs(cross(b, a1 - b1));
	double d2 = abs(cross(b, a2 - b1));
	double t = d1 / (d1 + d2);

	return a1 + (a2 - a1) * t;
}

// a1,a2を通る直線とb1,b2を通る直線の交差判定
int is_intersected_l(P a1, P a2, P b1, P b2) {
	return !EQ(cross(a1 - a2, b1 - b2), 0.0);
}

// a1,a2を通る直線とb1,b2を通る直線の交点計算
P intersection_l(P a1, P a2, P b1, P b2) {
	P a = a2 - a1; P b = b2 - b1;
	return a1 + a * cross(b, b1 - a1) / cross(b, a);
}

double getRadian(double x, double y, double x2, double y2) {
	double radian = atan2(y2 - y, x2 - x);
	return radian * 180 / pi;
}



//２つのベクトルABのなす角度θを求める
double AngleOf2Vector(P A, P B)
{
	//　※ベクトルの長さが0だと答えが出ませんので注意してください。

	//ベクトルAとBの長さを計算する
	double deg1 = atan2(A.imag(), A.real());
	double deg2 = atan2(B.imag(), B.real());
	//DEBUG(deg1);
	//DEBUG(deg2);
	if (deg1 < 0) {
		deg1 += 2 * pi;
	}
	if (deg2 < 0) {
		deg2 += 2 * pi;
	}
	double deg = deg1 - deg2;
	//DEBUG(deg);
	if (deg < 0) {
		deg += 2 * pi;
	}
	deg *= 180.0 / pi;
	if (deg >= 180) {
		deg = 360.0 - deg;
	}

	return deg;
}


signed main() {
	int n;
	cin >> n; 

	/*
	rep(i, n) {
		double x, y;
		cin >> x >> y;
		cout << atan2(y, x) * 180.0 / pi << endl;
	}
	//*/
	if (n == 1) {
		cout << 1 << endl;
		return 0;
	}
	vector<ci> xy(n);
	rep(i, n) {
		ll x, y;
		cin >> x >> y;
		xy[i].real(x); xy[i].imag(y);
	}
	auto xy2 = convex_hull(xy, n);
	/*
	rep(i, xy2.size()) {
		cout << xy2[i].real() << " " << xy2[i].imag() << endl;
	}
	//*/
	int n2 = xy2.size();
	//DEBUG(n2);
	vector<double> ans(n, -1);
	rep(i, n) {
		ci now = xy[i];
		bool flag = false;
		rep(j, xy2.size()) {
			if (now == xy2[j]) {
				flag = true;
				break;
			}
		}
		if (!flag) {
			ans[i] = 0;
		}
	}
	if (n2 == 2) {
		rep(i, n) {
			if (ans[i] < 0) {
				cout << 0.5 << endl;
			}
			else {
				cout << 0 << endl;
			}
		}
		return 0;
	}
	vector<P> xy3(n2);
	rep(i, n2) {
		xy3[i].real(xy2[i].real());
		xy3[i].imag(xy2[i].imag());
	}
	rep(i, n2) {
		//DEBUG(i);
		int pre, nex;
		if (i == 0) {
			pre = n2 - 1;
		}
		else {
			pre = i - 1;
		}
		if (i == n2 - 1) {
			nex = 0;
		}
		else {
			nex = i + 1;
		}
		double deg = AngleOf2Vector(xy3[pre] - xy3[i], xy3[nex] - xy3[i]);
		while (deg < 0) {
			deg += 360;
		}
		if (deg >= 180) {
			deg = 360 - deg;
		}
		//DEBUG(deg);
		rep(j, n) {
			if (xy2[i] == xy[j]) {
				ans[j] = (180 - deg) / 360;
				break;
			}
		}
	}

	rep(i, n) {
		Sp(ans[i]);
	}
}

Measured memory_bytes: 256