//MIPT Cryptozoology 17.2
#pragma comment(linker, "/STACK:512000000")
#define _CRT_SECURE_NO_WARNINGS
#include <bits/stdc++.h>
using namespace std;

#define all(a) a.begin(), a.end()
typedef long long li;
typedef long double ld;
void solve(__attribute__((unused)) bool);
void precalc();
clock_t start;
#define FILENAME ""

int main() {
#ifdef AIM
    string s = FILENAME;
    //assert(!s.empty());
    freopen("/home/alexandero/ClionProjects/cryptozoology/input.txt", "r", stdin);
#else
    //freopen(FILENAME ".in", "r", stdin);
    //freopen(FILENAME ".out", "w", stdout);
    //freopen("input.txt", "r", stdin);
    //freopen("output.txt", "w", stdout);
#endif
    start = clock();
    int t = 1;
#ifndef AIM
    cout.sync_with_stdio(0);
    cin.tie(0);
#endif
    precalc();
    cout.precision(10);
    cout << fixed;
    //cin >> t;
    int testNum = 1;
    while (t--) {
        //cout << "Case #" << testNum++ << ": ";
        //cerr << testNum << endl;
        solve(true);
        //cerr << testNum - 1 << endl;
    }
    cout.flush();
#ifdef AIM1
    while (true) {
      solve(false);
  }
#endif

#ifdef AIM
    cout.flush();
    auto end = clock();

    usleep(10000);
    print_stats(end - start);
    usleep(10000);
#endif

    return 0;
}

void precalc() {
}

template<typename T>
inline T nxt() {
    T cur;
    cin >> cur;
    return cur;
}

#define int li
//const int mod = 1000000007;

#define double ld

struct Point {
    int x, y;
    int id;
    Point() {}
    Point(int x, int y) : x(x), y(y) {}
    Point operator - (const Point& ot) const {
        return Point(x - ot.x, y - ot.y);
    }
    int operator * (const Point& ot) const {
        return x * ot.y - y * ot.x;
    }
    int operator % (const Point& ot) const {
        return x * ot.x + y * ot.y;
    }
    bool operator < (const Point& ot) const {
        return make_pair(x, y) < make_pair(ot.x, ot.y);
    }
    double dist() {
        return sqrtl(x * x + y * y);
    }
};

void solve(__attribute__((unused)) bool read) {
    int n;
    cin >> n;
    vector<Point> all_points(n);
    for (int i = 0; i < n; ++i) {
        cin >> all_points[i].x >> all_points[i].y;
        all_points[i].id = i;
    }
    sort(all(all_points));
    vector<Point> up, down;
    for (auto& pt : all_points) {
        while (up.size() > 1 && (up.back() - up[up.size() - 2]) * (up.back() - pt) <= 0) {
            up.pop_back();
        }
        up.push_back(pt);
        while (down.size() > 1 && (down.back() - down[down.size() - 2]) * (down.back() - pt) >= 0) {
            down.pop_back();
        }
        down.push_back(pt);
    }
    for (int i = (int)down.size() - 2; i > 0; --i) {
        up.push_back(down[i]);
    }
    auto points = up;
    vector<double> res(n, 0.0);
    n = points.size();
    if (n <= 2) {
        for (auto& pt : points) {
            res[pt.id] = 0.5;
        }
    } else {
        for (int i = 0; i < n; ++i) {
            int prev = (i + n - 1) % n, nex = (i + 1) % n;
            //cout << i << " " << prev << " " << nex << " " << n << endl;
            Point a = points[nex] - points[i];
            Point b = points[prev] - points[i];
            double co = (a % b) / 1.0 / a.dist() / b.dist();
            co = -co;
            //cout << "angle: " << acos(co) << " " << a.x << " " << a.y << " " << b.x << " " << b.y << endl;
            res[points[i].id] = acos(co) / 2 / acos(-1.0);
        }
    }

    for (auto x : res) {
        cout << x << "\n";
    }


}

Measured memory_bytes: 256