#include<iostream>
#include <list>
#include<stack>
#include<queue>
#include <vector>
#include <set>
#include<algorithm>
#include<math.h>
#include<stdlib.h>
#include<string>
#include <functional>


#define FOR(k,m,n) for(int (k)=(m);(k)<(n);(k)++)
#define REP(i,n) FOR((i),0,(n))
#define LL long long
#define CLR(a) memset((a),0,sizeof(a))
#define SZ(x) (int((x).size()))
#define WAITING(str) int str;std::cin>>str;
#define DEBUGING(str) cout<<str<<endl
using namespace std;

const LL MOD = 1000000007;// 10^9+7
const int INF = (1 << 30);
const long double EPS = 1e-10;
const long double PI = 3.14159265358979323846;

//ライブラリ要因


//二次元ベクトル構造体
struct P {
	int id;//識別番号
	long double x, y;
	long double gain = 0;

	P(){}
	P(long double x, long double y) :x(x), y(y),id(-1) {}
	P(int id , long double x, long double y):id(id),x(x),y(y){}

	P operator +(P p) { return P(add(x, p.x), add(y, p.y)); }
	P operator -(P p) { return P(add(x, -p.x), add(y, -p.y)); }
	P operator *(long double d) { return P(x*d, y*d); }

	long double dot(P p) { return add(x*p.x, y*p.y); }//内積
	long double det(P p) { return add(x*p.y, -y * p.x); }

	long double rad() const{ return atan2(y, x); }
	long double rad(P p)const { return P(x - p.x, y - p.y).rad(); }//pから見た、角度

	//誤差を考慮した足し算
	long double abs(long double num) { return (num > 0 ? num : -num); }
	long double add(long double a, long double b) {
		if (abs(a + b) < (EPS * (abs(a) + abs(b))))return 0;
		return a + b;
	}
};


//辞書順で比較
bool cmp_x(const P& p, const P& q) {
	if (p.x != q.x)return p.x < q.x;
	return p.y < q.y;
}
bool cmp_rad(const P& p, const P& q) {
	return (p.rad() < q.rad());
}

//凸法を求める
vector<P> convex_hull(vector<P>& ps) {
	int n = ps.size();  //元々の頂点数
	int k = 0;          //凸包の頂点数
	vector<P> qs(n * 2);//構築中の凸包

	sort(ps.begin(), ps.end(), cmp_x);
	//下側凸包の作成
	REP(i, n) {
		while (k > 1 && (qs[k - 1] - qs[k - 2]).det(ps[i] - qs[k - 1]) <= 0)k--;
		qs[k++] = ps[i];
	}
	//上側凸包の作成
	for (int i = n - 2, t = k; i >= 0; i--) {
		while (k > t && (qs[k - 1] - qs[k - 2]).det(ps[i] - qs[k - 1]) <= 0)k--;
		qs[k++] = ps[i];
	}
	qs.resize(k - 1);
	return qs;
}



//変数
int N;
vector<P> p;
vector<long double> ans;





//サブ関数
//入力
void input()
{
	cin >> N;
	ans.resize(N, 0);
	int x, y;
	REP(i, N) {
		cin >> x >> y;
		p.push_back(P(i, x, y));
	}
}

P find_center(const vector<P>& p) {
	long double x = 0, y = 0;
	for (auto num : p) {
		x += num.x;
		y += num.y;
	}
	x /= (int)p.size();
	y /= (int)p.size();
	return P(x, y);
}


//計算
void calc()
{
	auto qs = convex_hull(p);


	int len = qs.size();
	auto center = find_center(qs);
	REP(i, len) {
		qs[i].x -= center.x;
		qs[i].y -= center.y;
	}
	sort(qs.begin(), qs.end(), cmp_rad);



	vector<long double> rad;

	//反時計回りの、確率を計算
	REP(i, len - 1) {

		long double tmp = qs[i + 1].rad(qs[i]);
		rad.push_back(tmp);
	}
	long double tmp = qs[0].rad(qs[len - 1]);
	rad.push_back(tmp);



	REP(i, len - 1) {
		double tmp = rad[i + 1] - rad[i];
		qs[i + 1].gain = (tmp < 0 ? tmp + PI * 2 : tmp);
	}
	tmp = rad[0] - rad[len - 1];
	while (tmp < 0)tmp += 2 * PI;
	qs[0].gain = tmp;


	for (auto q : qs) {
		ans[q.id] = q.gain;
	}
}


//出力
void output()
{
	long double cnt = 0;
	for (auto num : ans) {
		cnt += num;
	}
	for (auto num : ans) {
		cout << num / cnt << endl;
	}
}


//デバッグ
void debug()
{
	int N;
	cin>>N;
}


//メイン関数
int main()
{
	input();
	calc();
	output();
	debug();
	
	return 0;
}


Measured memory_bytes: 256