// Original C++ solution (slower):
#include <bits/stdc++.h>

using namespace std;

using ll = long long;

using VI = vector<int>;

using VL = vector<ll>;

#define FOR(i,a,n) for(int (i)=(a);(i)<(n);++(i))

#define eFOR(i,a,n) for(int (i)=(a);(i)<=(n);++(i))

#define rFOR(i,a,n) for(int (i)=(n)-1;(i)>=(a);--(i))

#define erFOR(i,a,n) for(int (i)=(n);(i)>=(a);--(i))

#define SORT(i) sort((i).begin(),(i).end())

#define rSORT(i,a) sort((i).begin(),(i).end(),(a))

#define all(i) (i).begin(),(i).end()

#define out(y,x,h,w) (y) < 0 || (h) <= (y) || (x) < 0 || (w) <= (x)

constexpr ll INF = 1000000000;

constexpr ll LLINF = 1LL << 60;

constexpr ll mod = 1000000007;

constexpr ll MOD = 998244353;

const long double pi = acos(-1);

template<class T> inline bool chmax(T& a, T b) { if (a < b) { a = b; return 1; }return 0; }

template<class T> inline bool chmin(T& a, T b) { if (a > b) { a = b; return 1; }return 0; }

inline void init() { cin.tie(nullptr); cout.tie(nullptr); ios::sync_with_stdio(false); cout << fixed << setprecision(15); }

template<class T>inline istream& operator>>(istream& input, vector<T>& v) { for (auto& elemnt : v)input >> elemnt; return input; }



int main() {

    init();



    double a, b, x; cin >> a >> b >> x;

    double lim = a * a * b;



    double ans = -1;

    if (x <= lim / 2) {

        double ok = 0, ng = a;

        FOR(i, 0, 100000) {

            double mid = (ok + ng) / 2;

            if (a * b * mid / 2 <= x)ok = mid;

            else ng = mid;

        }

        ans = pi / 2 - atan(ok / b);

    }

    else {

        double ok = 0, ng = b;

        FOR(i, 0, 100000) {

            double mid = (ok + ng) / 2;

            if (a * a * mid / 2 <= lim - x)ok = mid;

            else ng = mid;

        }

        ans = atan(ok / a);

    }

    cout << ans / pi * 180 << "\n";

}


// Optimized solution to the same problem (faster):
#include <bits/stdc++.h>

using namespace std;

using ll = long long;

using VI = vector<int>;

using VL = vector<ll>;

#define FOR(i,a,n) for(int (i)=(a);(i)<(n);++(i))

#define eFOR(i,a,n) for(int (i)=(a);(i)<=(n);++(i))

#define rFOR(i,a,n) for(int (i)=(n)-1;(i)>=(a);--(i))

#define erFOR(i,a,n) for(int (i)=(n);(i)>=(a);--(i))

#define SORT(i) sort((i).begin(),(i).end())

#define rSORT(i,a) sort((i).begin(),(i).end(),(a))

#define all(i) (i).begin(),(i).end()

#define out(y,x,h,w) (y) < 0 || (h) <= (y) || (x) < 0 || (w) <= (x)

constexpr ll INF = 1000000000;

constexpr ll LLINF = 1LL << 60;

constexpr ll mod = 1000000007;

constexpr ll MOD = 998244353;

const long double pi = acos(-1);

template<class T> inline bool chmax(T& a, T b) { if (a < b) { a = b; return 1; }return 0; }

template<class T> inline bool chmin(T& a, T b) { if (a > b) { a = b; return 1; }return 0; }

inline void init() { cin.tie(nullptr); cout.tie(nullptr); ios::sync_with_stdio(false); cout << fixed << setprecision(15); }

template<class T>inline istream& operator>>(istream& input, vector<T>& v) { for (auto& elemnt : v)input >> elemnt; return input; }



int main() {

    init();



    double a, b, x; cin >> a >> b >> x;

    double lim = a * a * b;



    double ans = -1;

    if (x <= lim / 2) {

        double ok = 0, ng = a;

        FOR(i, 0,30) {

            double mid = (ok + ng) / 2;

            if (a * b * mid / 2 <= x)ok = mid;

            else ng = mid;

        }

        ans = pi / 2 - atan(ok / b);

    }

    else {

        double ok = 0, ng = b;

        FOR(i, 0, 30) {

            double mid = (ok + ng) / 2;

            if (a * a * mid / 2 <= lim - x)ok = mid;

            else ng = mid;

        }

        ans = atan(ok / a);

    }

    cout << ans / pi * 180 << "\n";

}


// Fastest known solution for this problem: