import java.util.*;
public class Main {
private static Double tp = 0.0;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Double red = sc.nextDouble();
Double blue = sc.nextDouble();
Double sum = red + blue;
Double totalP = 1.0;
helper(sum, totalP, red, blue, 0, 3, false);
System.out.println(tp);
}
// 这道题只有当A拿到红色的时候 flag 才会等于true.
public static void helper(double sum, double totalP, double red, double blue, int role, int sequence, boolean flag) {
if(flag) {
tp += totalP;
return ;
}
if(role % 3 == 0 ) {
// 只有A选择红球 直接获胜
double temp = totalP;
if(red > 0) {
helper(sum - 1, temp * red / sum, red - 1, blue, role + 1, sequence, true);
}
// 蓝球 继续跑
if (blue > 0) {
helper(sum - 1, temp * blue / sum, red, blue - 1, role + 1, sequence, false);
}
} else if( role % 3 == 1){
//对于B角色而言只要考虑他选择蓝色的球继续循环的情况,因为红球则终止。
if( blue > 0) {
helper(sum - 1, totalP * blue / sum, red, blue - 1, role + 1, sequence, false);
}
} else if( role % 3 == 2) {
double temp = totalP;
//对于C而言 蓝球和红球都要考虑
if( red > 0) {
helper(sum - 1, temp *= (red/sum), red - 1, blue, role + 1, sequence, false);
}
double temp2 = totalP;
if(blue > 0 ) {
helper(sum - 1, temp2 *= (blue/ sum), red, blue - 1, role + 1, sequence, false);
}
}
}
}