/*
    飲んだ魔剤で家が建つ。
    created at: 2020-12-11 15:15:32
*/

#include <bits/stdc++.h>
using namespace std;

map<vector<int>, long double> memo;

long double cnt (int a, int b, int c)
{
    long double x, y, z;
    x = y = z = 0.0l;

    if (a < 100 && b < 100 && c < 100) {
        vector<int> p, q, r;
        p = {a+1, b, c};
        q = {a, b+1, c};
        r = {a, b, c+1};

        if (memo[p] <= 0.0l) memo[p] = cnt(a+1, b, c);
        if (memo[q] <= 0.0l) memo[q] = cnt(a, b+1, c);
        if (memo[r] <= 0.0l) memo[r] = cnt(a, b, c+1);

        x = (1.0l + memo[p]) * a / (a + b + c);
        y = (1.0l + memo[q]) * b / (a + b + c);
        z = (1.0l + memo[r]) * c / (a + b + c);
    }

    return (x + y + z);
}

int main()
{
    int a, b, c;
    cin >> a >> b >> c;

    cout << setprecision(15) << cnt(a, b, c) << endl;

    return 0;
}

#include <bits/stdc++.h>
// #include <atcoder/all>
using namespace std;
using ll = long long;
using vi = vector<int>;
using vvi = vector<vector<int>>;
using vl = vector<long long>;
using vvl = vector<vector<long long>>;
#define rep(i, s, n) for (int i = (int)s; i < (int)n; i++)
#define repr(i, n, s) for (int i = (int)n; (int)s < i; i--)
#define len(a) (int)a.size()
#define all(a) a.begin(), a.end()
/* 1次元ベクトルをスペースでつなぎ、改行をつけて出力 vi, vl, list<int>, list<ll>に対応  */
template<class T> void print_elements(T a) {string str = ""; for (auto itr = a.begin(); itr != a.end(); ++itr) \
        str += to_string(*itr) + ' '; str.pop_back(); cout << str << endl;}

const int INF32 = 1 << 30;
const long long INF64 = 1LL << 60;
const double PI = acos(-1);

vector<vector<vector<double>>> dp(101, vector<vector<double>>(101, vector<double>(101, 0)));


int main() {
    int a, b, c;
    cin >> a >> b >> c;

    vector<vector<vector<double>>> dp(101, vector<vector<double>>(101, vector<double>(101, 0)));

    dp[a][b][c] = 1.0;

    rep(i, a, 101) {
        rep(j, b, 101) {
            rep(k, c, 101) {
                if (i < 100 && j < 100 && k < 100) {
                    dp[i+1][j][k] += dp[i][j][k] * i / (i + j + k);
                }
                if (j < 100 && k < 100 && i < 100) {
                    dp[i][j+1][k] += dp[i][j][k] * j / (i + j + k);
                }
                if (k < 100 && i < 100 && j < 100) {
                    dp[i][j][k+1] += dp[i][j][k] * k / (i + j + k);
                }
            }
        }
    }
    double ans = 0;
    rep(i, a, 100) {
        rep(j, b, 100) {
            int k = 100;
            ans += -((a - i) + (b - j) + (c - k)) * dp[i][j][k];
        }
    }
    rep(j, b, 100) {
        rep(k, c, 100) {
            int i = 100;
            ans += -((a - i) + (b - j) + (c - k)) * dp[i][j][k];
        }
    }
    rep(i, a, 100) {
        rep(k, c, 100) {
            int j = 100;
            ans += -((a - i) + (b - j) + (c - k)) * dp[i][j][k];
        }
    }
    cout << fixed << setprecision(9) <<  ans << endl;
}
