#include <iostream>
#include <iomanip>

double ans[112][112][112];

int main(){
	for(int i = 99; i >= 0; --i){
		for(int j = 99; j >= 0; --j){
			for(int k = 99; k >= 0; --k){
				int sum = i + j + k;
				ans[i][j][k] += ans[i + 1][j][k] * i;
				ans[i][j][k] += ans[i][j + 1][k] * j;
				ans[i][j][k] += ans[i][j][k + 1] * k;
				ans[i][j][k] /= sum;
				ans[i][j][k] += 1;
			}
		}
	}
	int a, b, c;
	std::cin >> a >> b >> c;
	std::cout << std::setprecision(100) << ans[a][b][c] << std::endl;
}

#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp> // Common file
#include <ext/pb_ds/tree_policy.hpp> // Including tree_order_statistics_node_update
using namespace __gnu_pbds;
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
const int inf=0x3f,INF=0x3f3f3f3f; const ll LLINF=0x3f3f3f3f3f3f3f3f;
#define sz(x) (int)x.size()
#define af(x) x.begin(), x.end()
#define ms(x, y) memset(x, y, sizeof x);
#define fil(x, y) fill(af(x), y);
#define pb push_back
#define lb lower_bound
#define ub upper_bound
#define f first
#define s second	
#define lc i << 1
#define rc i << 1 | 1
const int mod = 1e9 + 7;
ll fpow(ll a, ll b){ll ret=1;while(b){if(b&1)ret=ret*a%mod;a=a*a%mod,b>>=1;}return ret;}
ll inv(ll x){return x ? fpow(x, mod - 2) : 1;}
void madd(int &a, int b){a+=b;if(a>=mod)a-=mod;}
void msub(int &a, int b){a+=mod-b;if(a>=mod)a-=mod;}
const int MM = 2e5 + 5;
void solve(){
	int a, b, c;
	cin >> a >> b >> c;
	vector<vector<vector<double>>> dp(101, vector<vector<double>>(101, vector<double>(101)));
	function<double(int,int,int)> rec = [&](int x, int y, int z){	
		if (x == 100 || y == 100 || z == 100) return 0.0;
		if (dp[x][y][z] != 0.0) return dp[x][y][z];
		int t = x + y + z;
		return dp[x][y][z] = 1.0*x/t*(1.0+rec(x+1,y,z)) + 1.0*y/t*(1.0+rec(x,y+1,z)) + 1.0*z/t*(1.0+rec(x,y,z+1));
	};
	cout << fixed << setprecision(10) << rec(a, b, c) << '\n';
}

int main(){
	cin.sync_with_stdio(0); cin.tie(0); cout.tie(0);
	int t = 1;
	//cin >> t;
	while(t--) solve();
}
