#include<bits/stdc++.h> 
using namespace std;
int main()
{
	double a,b,c,d;
	double x,m;
	cin>>a>>b>>c>>d;
	m=d/b;
	x=(c-a)/(1+m)+a;
	printf("%.10lf",x);
	return 0;
}
#include <bits/stdc++.h>
 
using namespace std;

#define PB push_back
#define MP make_pair
#define LL long long
#define ll long long
#define int LL
#define FOR(i,a,b) for(int i = (a); i <= (b); i++)
#define RE(i,n) FOR(i,1,n)
#define REP(i,n) FOR(i,0,(int)(n)-1)
#define R(i,n) REP(i,n)
#define VI vector<int>
#define VVI vector<vector<int>>
#define PII pair<int,int>
#define VPII vector<PII>
#define LD long double
#define INF 1000000000000
#define MOD 1000000007
#define COMAX 110000 // combnation array max range
#define MAXR 100000 // array max range
#define FI first
#define SE second
#define PQG priority_queue<int,VI,greater<int>> // Ascending. e.g. 1..n
#define PQL priority_queue<int,VI,less<int>> // Descending. e.g. n..1
#define SETG set<int,greater<int>> // Descending. e.g. n..1
#define SETL set<int,less<int>> // Ascending. e.g. 1..n
#define vecprint(v) R(i,v.size())cerr << v[i] << " ";cerr << endl;
template<class T>bool chmax(T &a, const T &b) { if (a<b) { a=b; return 1; } return 0; }
template<class T>bool chmin(T &a, const T &b) { if (b<a) { a=b; return 1; } return 0; }
template<class T>T min(vector<T> &v) { return *min_element(v.begin(),v.end()); }
template<class T>T max(vector<T> &v) { return *max_element(v.begin(),v.end()); }
template<class T>T modpow(T a, T b, T m) { a %= m; T r = 1; while (b > 0) { if (b & 1) r = (r * a) % m; a = (a * a) % m; b >>= 1; } return r; }
ll modinv(ll a,ll m=MOD) {ll b = m, u = 1, v = 0;while (b) {ll t = a / b;a -= t * b; swap(a, b);u -= t * v; swap(u, v);}u %= m;if (u < 0) u += m;return u;}
template<class T>string radixconv(T n, T k){ string s; while(n/k){ s=to_string(n%k)+s; n/=k; } s=to_string(n%k)+s; return s; }
template<class T>vector<T> divs(T n){ T t=1; vector<T> r; while(t*t<=n){ if(!(n%t)){ r.push_back(t); if(t!=(n/t)) r.push_back(n/t); } t++; } return r; } //  sqrt(n)
template<class T>vector<T> commondivs(vector<T> ns){ T mn=min(ns); vector<T> r; for(auto &d:divs(mn)){ for(int i=0;i<(int)ns.size();i++){ if(ns[i]%d) break; if(!((int)ns.size()-1-i)) r.push_back(d); } } return r; }
template<class T>vector<bool> eratosieve(T n){vector<bool> r((n+1>2 ? n+1 : 2),1);r[0]=0;r[1]=0;for(int i=2;i*i<=n;i++){if(r[i]){for(int j=i+i;j<=n;j+=i){r[j]=0;}}}return r;} // nloglogn
template<class T>T gcd(T a, T b) { return b ? gcd(b, a%b) : a; }
template<class T>T lcm(T a, T b) { return a*b/gcd(a,b); }
template<class T>vector<T> primefactor(T n){ vector<T> r; auto c = divs(n); for(auto &i:c){ for(auto &j:c){ if(i!=j && j!=1 && !(i%j)) break; if(j==c.back()) r.push_back(i); } } return r; } 
template<class T>vector<pair<T,T>> primefactors(T n){ vector<pair<T,T>> r; for(int i=2;i*i<=n;i++){if(n%i)continue;int e=0;while(!(n%i)){n/=i;e++;}r.push_back(make_pair(i,e));}if(n!=1) r.push_back(make_pair(n,1));return r; } 
template<class T>long long binsearch(long long from,long long to,T fn){while(to-from > 1){long long mid = (to+from)/2;if(fn(mid)){from=mid;}else{to=mid;}}return from;}
struct Comb{ll fac[COMAX+1],finv[COMAX+1],inv[COMAX+1];Comb() {init();}void init() {fac[0]=fac[1]=1;finv[0]=finv[1]=1;inv[1]=1;FOR(i,2,COMAX){fac[i] = ((fac[i - 1]%MOD) * (i%MOD)) % MOD;inv[i] = (((-inv[MOD%i]%MOD+MOD)%MOD) * ((MOD/i) % MOD))%MOD;finv[i] = ((finv[i - 1]%MOD) * (inv[i]%MOD)) % MOD;}}ll com(ll n,ll k){if(n<k)return 0;if(n<0 || k<0)return 0;return (((fac[n] * finv[k])%MOD) * finv[n - k] % MOD) % MOD;}};

int32_t main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout << fixed << setprecision(11);
    cerr << fixed << setprecision(6);
    LD x1,y1,x2,y2;
    cin >> x1 >> y1 >> x2 >> y2;
    y2=-y2;
    cerr << "y2:" << y2 << endl;
    LD a=(y2-y1)/(x2-x1);
    cerr << "a:" << a << endl;
    LD b=y1-a*x1;
    cerr << "b:" << b << endl;
    LD ans=b/(-a);
    //if(x1<x2){
    //    ans=abs(ans)+x1;
    //}else{
    //    ans=x1-abs(ans);
    //}
    cout << ans << endl;
    return 0;
}
