#include <bits/stdc++.h>
using namespace std;
const double pi = acos(-1);
template <class T>
struct Point {
  T x, y;
  explicit Point(T x = 0, T y = 0) : x(x), y(y) {}
  bool operator<(Point p) const { return tie(x, y) < tie(p.x, p.y); }
  bool operator==(Point p) const { return tie(x, y) == tie(p.x, p.y); }
  Point operator+(Point p) const { return Point(x + p.x, y + p.y); }
  Point operator-(Point p) const { return Point(x - p.x, y - p.y); }
  Point operator*(T d) const { return Point(x * d, y * d); }
  Point operator/(T d) const { return Point(x / d, y / d); }
  T dot(Point p) const { return x * p.x + y * p.y; }
  T cross(Point p) const { return x * p.y - y * p.x; }
  T cross(Point a, Point b) const { return (a - *this).cross(b - *this); }
  T dist2() const { return x * x + y * y; }
  double dist() const { return sqrt((double)dist2()); }
  double angle() const { return atan2(y, x); }
  Point unit() const { return *this / dist(); }
  Point perp() const { return Point(-y, x); }
  Point normal() const { return perp().unit(); }
  Point rotate(double a) const {
    return Point(x * cos(a) - y * sin(a), x * sin(a) + y * cos(a));
  }
  string toStr();
};
template <class Point>
int segmentIntersection(const Point& s1, const Point& e1, const Point& s2,
                        const Point& e2, Point& r1, Point& r2) {
  if (e1 == s1) {
    if (e2 == s2) {
      if (e1 == e2) {
        r1 = e1;
        return 1;
      } else
        return 0;
    } else
      return segmentIntersection(s2, e2, s1, e1, r1, r2);
  }
  Point v1 = e1 - s1, v2 = e2 - s2, d = s2 - s1;
  auto a = v1.cross(v2), a1 = v1.cross(d), a2 = v2.cross(d);
  if (a == 0) {
    auto b1 = s1.dot(v1), c1 = e1.dot(v1), b2 = s2.dot(v1), c2 = e2.dot(v1);
    if (a1 || a2 || max(b1, min(b2, c2)) > min(c1, max(b2, c2))) return 0;
    r1 = min(b2, c2) < b1 ? s1 : (b2 < c2 ? s2 : e2);
    r2 = max(b2, c2) > c1 ? e1 : (b2 > c2 ? s2 : e2);
    return 2 - (r1 == r2);
  }
  if (a < 0) {
    a = -a;
    a1 = -a1;
    a2 = -a2;
  }
  if (0 < a1 || a < -a1 || 0 < a2 || a < -a2) return 0;
  r1 = s1 - v1 * a2 / a;
  return 1;
}
template <class T>
string Point<T>::toStr() {
  char ans[500];
  sprintf(ans, "(%.2lf , %.2lf)", x, y);
  return ans;
}
double calcArea(Point<double> a, Point<double> b, Point<double> q,
                Point<double> r, double ang) {
  Point<double> dummy, mt;
  segmentIntersection(a, b, q, r, mt, dummy);
  double bt = (mt - r).dist();
  double at = bt * tan(ang);
  return at * bt;
}
int main() {
  double w, h;
  int ang;
  scanf("%lf%lf%d", &w, &h, &ang);
  ang = min(ang, 180 - ang);
  if (ang == 0 || (ang == 90 && w == h)) {
    printf("%.9lf\n", w * h);
    return 0;
  }
  if (w < h) swap(w, h);
  Point<double> ur(w / 2, h / 2);
  Point<double> ul(-w / 2, h / 2), dr(w / 2, -h / 2), dl(-w / 2, -h / 2);
  Point<double> urRot = ur.rotate(ang * (pi / 180)),
                drRot = dr.rotate(ang * (pi / 180));
  Point<double> ulRot = ul.rotate(ang * (pi / 180));
  if (drRot.y >= ur.y) {
    Point<double> dummy, l, r;
    Point<double> dlRot = dl.rotate(ang * (pi / 180));
    segmentIntersection(ul, ur, ulRot, urRot, l, dummy);
    segmentIntersection(ul, ur, dlRot, drRot, r, dummy);
    printf("%.9lf\n", abs(r.x - l.x) * h);
  } else {
    printf("%.9lf\n",
           w * h - (calcArea(ul, ur, ulRot, urRot, ang * (pi / 180)) +
                    calcArea(ur, dr, urRot, drRot, ang * (pi / 180))));
  }
}
