#include <cstdio>
#include <cmath>

struct point {
	double x , y;
	
	point () {}
	point ( double _x , double _y ) {
		x = _x; y = _y;
	}
};

double p , q , r;

void read() {
	int temp = scanf ( "%lf%lf%lf" , &p , &q , &r );
	temp *= 2;
}

point getc ( point a , point b ) {
	point c = point ( a.x - (b.y - a.y) , a.y + (b.x - a.x) );
	
// 	printf ( "%lf %lf\n" , c.x , c.y );
	
	double delta = (p + q) / (c.x - a.x);
	
	c.x = (c.x - a.x) * delta;
	c.y = (c.y - a.y) * delta;
	
	return c;
}

point getd ( point a , point b ) {
	point c = point ( b.x - (b.y - a.y) , b.y + (b.x - a.x) );
	
// 	printf ( "%lf %lf\n" , c.x , c.y );
	
	double delta = (q + r) / (c.x - b.x);
	
	c.x = b.x + (c.x - b.x) * delta;
	c.y = b.y + (c.y - b.y) * delta;
	
	return c;
}

double dist ( point a , point b ) {
	return sqrt ( (a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y) );
}

void solve() {
	point a = point ( 0 , 0 );
	point b = point ( p , 0 );
	point c , d;
	double l = 1e-9 , r = 1e9 , mid1 , mid2 , val1 , val2;
	
	for (int iter = 0; iter < 10000; iter++) {
		mid1 = l + (r - l) / 3;
		mid2 = r - (r - l) / 3;
		
// 		printf ( "%lf %lf    %lf %lf\n" , l , r , mid1 , mid2 );
		
		b.y = - mid1;
		c = getc ( a , b );
		val1 = dist ( a , c ) * dist ( a , b );
		
		b.y = - mid2;
		c = getc ( a , b );
		val2 = dist ( a , c ) * dist ( a , b );
		
		if ( val1 > val2 )
			l = mid1;
		else
			r = mid2;
	}
	
// 	printf ( "%lf %lf\n" , l , r );
	
	b.y = -((l + r) / 2);
	
	c = getc ( a , b );
	d = getd ( a , b );
	
// 	printf ( "%lf\n" , dist ( a , b ) );
// 	printf ( "%lf\n\n" , dist ( c , d ) );
// 	printf ( "%lf\n" , dist ( a , c ) );
// 	printf ( "%lf\n\n" , dist ( b , d ) );
	
	printf ( "%.4lf\n" , dist ( a , b ) * dist ( a , c ) );
// 	printf ( "%lf %lf   %lf %lf\n" , c.x , c.y , d.x , d.y );
}

int main() {
	read();
	solve();
	
	return 0;
}
