#include <iostream>
#include <algorithm>
#include <cmath>
#include <map>
#include <vector>
#include <queue>
#include <functional>
#include <string>
#include <stack>
#include <set>
#include <sstream>
#include <iomanip>
#include <limits>
#include <cstring>

using namespace std;
using ll = long long;
typedef unsigned long long ull;
typedef pair<ll, ll> P;
typedef pair<string, string> sP;
typedef pair<ll, pair<ll, ll>> PP;
typedef pair<double, double >pd;

const ll mod = 1e4;
const ll MOD = 1e9 + 7;
const ll MOD2 = 998244353;
const ll INF = 1 << 30;
const ll INF2 = 9e18;
const double INF3 = 9e14;
const double eps = 1e-10;
const double PI = 3.14159265358979323846;
const int dx[4] = { 1,0,-1,0 }, dy[4] = { 0,1,0,-1 };
const int tx[8] = { -1,0,1,-1,1,-1,0,1 }, ty[8] = { -1,-1,-1,0,0,1,1,1 };

#define ALL(x) (x).begin(),(x).end()
#define ALLR(x) (x).rbegin(),(x).rend()
#define pb push_back
#define eb emplace_back
#define fr first
#define sc second





//誤差を考慮して足し算
double add(double a, double b) {
	if (abs(a + b) < eps*(abs(a) + abs(b))) {
		return 0;
	}
	return a + b;
}

//二次元ベクトル構造体
struct pp {
	double x, y;
	pp() {}
	pp(double x, double y) :x(x), y(y) {}
	pp operator+(pp p) {
		return pp(add(x, p.x), add(y, p.y));
	}
	pp operator-(pp p) {
		return pp(add(x, -p.x), add(y, -p.y));
	}
	pp operator*(double d) {
		return pp(add(x, d), add(y, d));
	}
	double dot(pp p) {//内積
		return add(x*p.x, y*p.y);
	}
	double det(pp p) {//外積
		return add(x*p.y, -y * p.x);
	}
};

double dist(pp p, pp q) {//距離の二乗
	return (p - q).dot(p - q);
}

bool cmp_x(const pp& p, const pp& q) {
	if (p.x != q.x)return p.x < q.x;
	return p.y < q.y;
}


//凸包
vector<pp>convex_full(pp* ps, int N) {
	sort(ps, ps + N, cmp_x);
	int k = 0;
	vector<pp>qs(N * 2);
	//下側凸包
	for (int i = 0;i < N;i++) {
		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;
}

double Cosine_theorem(pp a, pp b, pp c) {//余弦定理　角Bが求めたい角度
	double ba = dist(a, b);
	double bc = dist(b, c);
	double ac = dist(a, c);
	double cos_sita = (ba + bc - ac) / (2.0 * sqrt(ba)*sqrt(bc));
	return cos_sita;
}

double get_vector_length(pp v) {//ベクトルのスカラー値
	return pow((v.x * v.x) + (v.y * v.y), 0.5);
}

double Angle(pp A, pp B,pp C)
{
	double length_A = get_vector_length(B - A);
	double length_B = get_vector_length(B - C);

	double cos_sita = (B - A).dot(B - C) / (length_A * length_B);

	if (abs(cos_sita) > 1)return INF;
	else return cos_sita;
	double sita = acos(cos_sita);
}


int n;
double x[110], y[110];
pp ps[10000];

int main() {
	cin >> n;
	map<pd, double>ans;
	for (int i = 0;i < n;i++) {
		cin >> x[i] >> y[i];
		ps[i].x = x[i];
		ps[i].y = y[i];
	}
	vector<pp>qs = convex_full(ps, n);
	if (qs.size() == 2) {
		ans[pd(qs[0].x, qs[0].y)] = 0.5;
		ans[pd(qs[1].x, qs[1].y)] = 0.5;
		for (int i = 0;i < n;i++) {
			if (!ans[pd(x[i], y[i])])cout << 0 << endl;
			else cout << setprecision(17) << ans[pd(x[i], y[i])] << endl;
		}
		return 0;
	}
	for (int i = 0;i < qs.size();i++) {
		if (Angle(qs[(i - 1 + qs.size()) % qs.size()], qs[i], qs[(i + 1) % qs.size()]) == INF) {
			ans[pd(qs[i].x, qs[i].y)] = 0;
			continue;
		}
		double sita = acos(Angle(qs[(i - 1 + qs.size()) % qs.size()], qs[i], qs[(i + 1) % qs.size()]));
		if (sita > PI)ans[pd(qs[i].x, qs[i].y)] = 0;
		else ans[pd(qs[i].x, qs[i].y)] = (PI - sita) / (2.0 * PI);
	}
	for (int i = 0;i < n;i++) {
		if (!ans[pd(x[i], y[i])])cout << 0 << endl;
		else cout <<setprecision(17)<< ans[pd(x[i], y[i])] << endl;
	}
	return 0;
}

Measured memory_bytes: 640