#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));
}
