#include <bits/stdc++.h>
using namespace std;
complex<double> rotate_by(const complex<double>& p, double radians) {
  return p * polar(1.0, radians);
}
double dot(const complex<double>& a, const complex<double>& b) {
  return real(conj(a) * b);
}
double cross(const complex<double>& a, const complex<double>& b) {
  return (conj(a) * b).imag();
}
complex<double> intersect(const complex<double>& a, const complex<double>& b,
                          const complex<double>& p, const complex<double>& q) {
  double d1 = cross(p - a, b - a);
  double d2 = cross(q - a, b - a);
  return (d1 * q - d2 * p) / (d1 - d2);
}
double area(const vector<complex<double> >& p) {
  double area = 0;
  for (int i = 0; i < (int)p.size(); i++) {
    int j = (i + 1) % (int)p.size();
    area += p[i].real() * p[j].imag() - p[j].real() * p[i].imag();
  }
  return fabs(area / 2.0);
}
bool lines_parallel(complex<double>& a, complex<double>& b, complex<double>& c,
                    complex<double>& d) {
  return fabs(cross(b - a, c - d)) < 1e-9;
}
bool lines_collinear(complex<double>& a, complex<double>& b, complex<double>& c,
                     complex<double>& d) {
  return lines_parallel(a, b, c, d) && fabs(cross(a - b, a - c)) < 1e-9 &&
         fabs(cross(c - d, c - a)) < 1e-9;
}
double dist2(complex<double>& p, complex<double>& q) {
  return dot(p - q, p - q);
}
bool segments_intersect(complex<double> a, complex<double> b, complex<double> c,
                        complex<double> d) {
  if (lines_collinear(a, b, c, d)) {
    if (dist2(a, c) < 1e-9 || dist2(a, d) < 1e-9 || dist2(b, c) < 1e-9 ||
        dist2(b, d) < 1e-9)
      return true;
    if (dot(c - a, c - b) > 0 && dot(d - a, d - b) > 0 && dot(c - b, d - b) > 0)
      return false;
    return true;
  }
  if (cross(d - a, b - a) * cross(c - a, b - a) > 0) return false;
  if (cross(a - c, d - c) * cross(b - c, d - c) > 0) return false;
  return true;
}
int main() {
  ios::sync_with_stdio(false), cin.tie(nullptr);
  cout << fixed << setprecision(6);
  double w, h, a;
  cin >> w >> h >> a;
  if (a == 0 or a == 180) {
    cout << w * h << '\n';
    return 0;
  } else if (a == 90) {
    cout << pow(min(h, w), 2) << '\n';
    return 0;
  }
  vector<complex<double> > r = {{w / 2, h / 2},
                                {-w / 2, h / 2},
                                {-w / 2, -h / 2},
                                {w / 2, -h / 2},
                                {w / 2, h / 2}},
                           r1;
  r1 = r;
  if (a > 90) a = 180 - a;
  for (auto& i : r1) {
    i = rotate_by(i, a * 3.1415926535897932384626433832795 / 180.0);
    if (abs(i.real()) < 1e-9) i = {0.0, i.imag()};
    if (abs(i.imag()) < 1e-9) i = {i.real(), 0.0};
  }
  vector<complex<double> > res;
  for (int i = 0; i < 5; i++) {
    int j = (i + 1) % 5;
    for (int k = 0; k < 5; k++) {
      int h = (k + 1) % 5;
      if (segments_intersect(r1[i], r1[j], r[k], r[h]))
        res.push_back(intersect(r1[i], r1[j], r[k], r[h]));
    }
  }
  swap(res[res.size() - 1], res[res.size() - 2]);
  res.push_back(res[0]);
  for (auto& i : res) {
    if (abs(i.real()) < 1e-9) i = {0.0, i.imag()};
    if (abs(i.imag()) < 1e-9) i = {i.real(), 0.0};
  }
  cout << area(res) << '\n';
  return 0;
}
