#include <bits/stdc++.h>
using namespace std;
const double EPS = 1e-9;
const int INF = 0x3f3f3f3f;
const double PI = acos(-1.0);
const int MAX = 100005;
const int MOD = 1000000007;
inline bool isEq(double a, double b) { return abs(a - b) < EPS; }
inline double toRad(double deg) { return deg * PI / 180; }
inline double toDeg(double rad) { return rad * 180 / PI; }
inline int geti(int &_int) { return scanf("%d", &_int); }
inline int getii(int &_int, int &_int2) {
  return scanf("%d %d", &_int, &_int2);
}
inline int getiii(int &_int, int &_int2, int &_int3) {
  return scanf("%d %d %d", &_int, &_int2, &_int3);
}
inline int getd(double &_double) { return scanf("%lf", &_double); }
inline int getdd(double &_double, double &_double2) {
  return scanf("%lf %lf", &_double, &_double2);
}
inline int getstr(char *str) { return scanf("%s", str); }
double cross(complex<double> a, complex<double> b) {
  return (conj(a) * b).imag();
}
double dot(complex<double> a, complex<double> b) {
  return (conj(a) * b).real();
}
bool isCCW(complex<double> a, complex<double> b) { return cross(a, b) > 0; }
double getHeight(complex<double> A, complex<double> B, complex<double> C) {
  complex<double> AB = B - A;
  complex<double> AC = C - A;
  return abs(cross(AB, AC) / abs(AB));
}
complex<double> intersectPoint(complex<double> l1a, complex<double> l1b,
                               complex<double> l2a, complex<double> l2b) {
  complex<double> ab1 = l1b - l1a;
  complex<double> ab2 = l2b - l2a;
  double t = (ab1.real() * (l2a.imag() - l1a.imag()) +
              ab1.imag() * (l1a.real() - l2a.real())) /
             (ab1.imag() * ab2.real() - ab1.real() * ab2.imag());
  return l2a + t * ab2;
}
complex<double> findInter(complex<double> A, complex<double> B,
                          complex<double> A2, complex<double> B2) {
  complex<double> v = B2 - A2;
  double lo = 0, hi = abs(v), scal;
  v = v / abs(v);
  int cnt = 100;
  complex<double> pp;
  while (cnt--) {
    scal = (lo + hi) / 2;
    pp = A2 + v * scal;
    if (isCCW(A - B, pp - B))
      lo = scal;
    else
      hi = scal;
  }
  return pp;
}
int main(int argc, char *argv[]) {
  double w, h;
  int a;
  getdd(w, h);
  geti(a);
  if ((w == h && a % 90 == 0) || (w != h && a % 180 == 0)) {
    printf("%.10lf\n", w * h);
    return 0;
  }
  if (w < h) swap(w, h);
  complex<double> A = complex<double>(w / 2, h / 2);
  complex<double> B = complex<double>(-w / 2, h / 2);
  complex<double> C = -A;
  complex<double> D = -B;
  complex<double> pp = polar(1.0, toRad(a));
  complex<double> A2 = A * pp;
  complex<double> B2 = B * pp;
  complex<double> C2 = C * pp;
  complex<double> D2 = D * pp;
  double thrAng = acos(dot(A, D) / abs(A) / abs(D));
  double area;
  if (toRad(a) <= thrAng) {
    complex<double> inter1 = intersectPoint(A, B, A2, B2);
    complex<double> inter2 = intersectPoint(A, B, D2, A2);
    double tri1Area = abs(cross(inter1 - inter2, A2 - inter1)) / 2;
    inter1 = intersectPoint(D, A, C2, D2);
    inter2 = intersectPoint(D, A, D2, A2);
    double tri2Area = abs(cross(inter1 - inter2, D2 - inter1)) / 2;
    area = w * h - 2 * tri1Area - 2 * tri2Area;
  } else if (toRad(a) >= PI - thrAng) {
    complex<double> inter1 = intersectPoint(A, B, A2, D2);
    complex<double> inter2 = intersectPoint(A, B, D2, C2);
    double tri1Area = abs(cross(inter1 - inter2, D2 - inter1)) / 2;
    inter1 = intersectPoint(D, A, C2, D2);
    inter2 = intersectPoint(D, A, B2, C2);
    double tri2Area = abs(cross(inter1 - inter2, C2 - inter1)) / 2;
    area = w * h - 2 * tri1Area - 2 * tri2Area;
  } else {
    complex<double> intersecTion1 = intersectPoint(A, B, A2, B2);
    complex<double> intersecTion2 = intersectPoint(A, B, D2, C2);
    area =
        (abs(intersecTion1 - A2) + abs(intersecTion2 - D2)) * abs(D2 - A2) / 2;
    area = w * h - 2 * area;
  }
  printf("%.10lf\n", area);
  return 0;
}
