#include <bits/stdc++.h>
#include <map>
#include <set>
#include <vector>
#include <algorithm>
#include <iostream>
#include <bitset>
#include <cassert>
#include <queue>
#include <random>
#include <stack>
#include <iomanip>
#define _USE_MATH_DEFINES
#include <math.h>
using namespace std;
#define rep(i, n) for (ll i = 0; i < (ll)n; i++)
#define repf(i, a, b) for (ll i = (ll)a; i < (ll)b; i++)
#define repr(i, a, b) for (ll i = (ll)a; i > (ll)b; i--)
#define repv(x, arr) for (auto &x : arr)
#define all(v) (v).begin(), (v).end()
#define vec(name, num) vector<ll> name((num), 0);
#define mp(a, b) make_pair(a, b)
#define pb(x) push_back(x)
#define F first
#define S second
typedef long long ll;
typedef long double ld;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef pair<ld, ld> pdd;
typedef vector<ll> vll;
typedef vector<vll> vvll;
typedef vector<int> vii;
typedef vector<vii> vvii;
const ll mod = 1e9 + 7;
const int infi = 2147483600;
const ll infl = 1e17;

int main()
{
    int n;
    cin >> n;
    vector<pair<ld, ld>> point(n);
    rep(i, n)
    {
        ld x, y;
        cin >> x >> y;
        point[i] = mp(x, y);
    }
    ld pi = M_PI;
    ld zero = (ld)0;
    rep(i, n)
    {
        vector<ld> MIN;
        rep(j, n)
        {
            if (i == j)
                continue;
            if (point[i].F == point[j].F && point[i].S == point[j].S && i > j)
            { //もし一致しているなら、小さい方優先になる。iが大きければ0。
                break;
            }
            else if (point[i].F == point[j].F && point[i].S == point[j].S && i < j)
            { //iが小さければjは特に影響しない
                continue;
            }
            if (point[i].F == point[j].F)
            {
                //x座標が一致するとき、x軸平行な線が引かれる。
                //上側か、下側かで更新
                if (point[i].S > point[j].S)
                {
                    MIN.pb(zero);
                }
                else
                {
                    MIN.pb(pi);
                }
                continue;
            }
            else if (point[i].S == point[j].S)
            {
                //y座標が一致するとき、y軸平行な線が引かれる
                //右側か、左側かで更新
                if (point[i].F > point[j].F)
                {
                    MIN.pb(3 * pi / 2);
                }
                else
                {
                    MIN.pb(pi / 2);
                }
            }
            ld katamuki = (point[j].S - point[i].S) / (point[j].F - point[i].F);
            katamuki = (-1) / (katamuki);
            ld k = atan(katamuki);
            //傾きと、それを示すラジアンを計算した
            //kは-pi/2~pi/2なことに注意
            if (katamuki < 0)
            {
                //傾きマイナス：'\'これ
                //　.\ to \.の2通りで場合分け
                if (point[i].F < point[j].F)
                {
                    MIN.pb(k + pi);
                }
                else
                {
                    MIN.pb(k + 2 * pi);
                }
            }
            else
            {
                //傾きプラス：/これ
                //　./ to /.の2通りで場合分け
                if (point[i].F < point[j].F)
                {
                    MIN.pb(k);
                }
                else
                {
                    MIN.pb(k + pi);
                }
            }
        }
        //minとmaxの範囲を2piで割ったものが、確率。
        sort(all(MIN));
        pair<ld, ld> now = mp(MIN[0], MIN[0] + pi);
        ld ans = 1;
/*
        cout << "point " << i << " : ";
        rep(x, MIN.size()) cout << MIN[x] << " ";
        cout << endl;
 */
        repf(x,1,MIN.size()){
            if (MIN[x] <= now.F && now.S <= MIN[x] + pi)
                continue;
            else if (MIN[x]-pi>=now.S)
                continue;
            else if (MIN[x] <= now.S && MIN[x] >= now.F)
                now = mp(MIN[x], now.S);
            else if (MIN[x] - pi >= now.F && MIN[x] - pi <= now.S)
                now = mp(now.F, MIN[x] - pi);
            else
                ans = 0;
        }
        std::cout << std::fixed;
        cout << setprecision(10) << ans*(now.S-now.F)/(2*pi) << endl;
    }
    /*
    それぞれの関係で、長さpiの範囲が分かる
    全ての範囲で積を取れれば良い
    minとmaxを計算する
    
    はじめの範囲を基準に動かしてもいいかも？
    上側なら＋～＋
    下側ならー～ー
    下側：maxが傾き、minが傾き-pi
    上側：maxが傾き+pi、minが傾き
     */

    /*
    考察まとめ
    
    まず、2点で考える。
    この2点はどこを基準に確率が決まるか。
    垂直二等分線を引いて、点がある側ならそっちに入る
    垂直二等分線は原点を通るとして良い。なぜなら、全体の円が十分に大きいので
    10^6と0を近似してよい。相対誤差が10^-5以下になることが保証される

    ある点の確率を考える
    他の点全てと垂直二等分線を引く
    で、自分があるところの範囲を見る
    ｘ＞０とｘ＜０で傾きの最小とか最大とかを持つ
    範囲の傾きがうまいことわかる。
    これはsinxかcosxなので逆三角関数asin、acosを使って角度xがわかる
    これを2piで割ったものがその点になる確率である。
     */
}


Measured memory_bytes: 384