#include <bits/stdc++.h>   using namespace std;   inline bool isPowerOfTwo(int x) { return (x != 0 && (x & (x - 1)) == 0); }   double pi = 3.141592653589793238462643;   int month[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};   int dx[8] = {1, 0, -1, 0, 1, -1, -1, 1};   int dy[8] = {0, 1, 0, -1, 1, 1, -1, -1};   inline int add(int a, int b, int m = 1000000007) {     a += b;     if (a >= m) a -= m;     return a;   }   inline int mul(int a, int b, int m = 1000000007) {     return (int)(((long long)a * (long long)b) % m);   }   inline bool ispalin(string &str) {     int n = str.length();     for (int i = 0; i < n / 2; i++)       if (str[i] != str[n - i - 1]) return false;     return true;   }   long long expo(long long base, long long pow) {     long long ans = 1;     while (pow != 0) {       if (pow & 1 == 1) {         ans = ans * base;         ans = ans % 1000000007;       }       base *= base;       base %= 1000000007;       pow /= 2;     }     return ans;   }   void swapp(int *a, int *b) {     int temp = *a;     *a = *b;     *b = temp;   }   long long invt(long long x) { return expo(x, 1000000007 - 2); }   int expFactor(int n, int p) {     int x = p;     int exponent = 0;     while ((n / x) > 0) {       exponent += n / x;       x *= p;     }     return exponent;   }   inline int countsetbit(int n) {     unsigned int count = 0;     while (n) {       n &= (n - 1);       count++;     }     return count;   }   inline int abs(int x) {     if (x < 0) return -x;     return x;   }   bool isPal(string ss) {     int len = ss.length();     for (int i = 0; i < len / 2; i++) {       int comp = len - i - 1;       if (ss[i] != ss[comp]) return false;     }     return true;   }   vector<long long> fact, inv;   void calfal(int maxn) {     fact.resize(maxn);     inv.resize(maxn);     fact[0] = inv[0] = inv[1] = 1;     for (int i = (1); i <= (maxn - 1); ++i)       fact[i] = i * fact[i - 1] % 1000000007;     for (int i = (2); i <= (maxn - 1); ++i)       inv[i] = (1000000007 - 1000000007 / i) * inv[1000000007 % i] % 1000000007;     for (int i = (1); i <= (maxn - 1); ++i)       inv[i] = inv[i] * inv[i - 1] % 1000000007;   }   long long ncr(int n, int r) {     if (r > n) return 0;     return (fact[n] * inv[r] % 1000000007) * inv[n - r] % 1000000007;   }   long long _sieve_size;   bitset<10000010> bs;   vector<int> primes;   void sieve(long long upperbound) {     _sieve_size = upperbound + 1;     bs.set();     bs[0] = bs[1] = 0;     for (long long i = 2; i <= _sieve_size; i++)       if (bs[i]) {         for (long long j = i * i; j <= _sieve_size; j += i) bs[j] = 0;         primes.push_back((int)i);       }   }   bool isPrime(long long N) {     if (N <= _sieve_size) return bs[N];     for (int i = 0; i < (int)primes.size(); i++)       if (N % primes[i] == 0) return false;     return true;   }   double dpw[1001][1001][2], dpl1[1001][1001][2], dp[1001][1001][2];   int w, b;   double fun(int turn, int ww, int bb) {     if (ww >= w) {       return 0;     }     if (bb > b) {       return 0;     }     if (turn == 1 && bb >= b) {       return 0;     }     if (dp[ww][bb][turn] != -1) {       return dp[ww][bb][turn];     }     if (turn) {       double x, y;       x = (w - ww) * 1.0 / (b - bb - 1 + w - ww);       y = ((b - bb - 1) * 1.0 / (b - bb - 1 + w - ww));       if (bb == b - 1) {         y = 0;       }       dp[ww][bb][turn] = (y * fun((turn + 1) % 2, ww, bb + 2) +                           x * fun((turn + 1) % 2, ww + 1, bb + 1)) *                          ((b - bb) * 1.0 / (b - bb + w - ww));     } else {       dp[ww][bb][turn] =           (w - ww) * 1.0 / (b - bb + w - ww) +           fun((turn + 1) % 2, ww, bb + 1) * ((b - bb) * 1.0 / (b - bb + w - ww));     }     return dp[ww][bb][turn];   }   int main() {     cin >> w >> b;     if (!w) {       cout << 0 << endl;       return 0;     }     for (int i = (0); i <= (1); ++i) {       for (int j = (0); j <= (w + 1); ++j) {         for (int k = (0); k <= (b + 1); ++k) {           dp[j][k][i] = -1;         }       }     }     printf( %.10f , fun(0, 0, 0));   }