#include <bits/stdc++.h>
#define fast  ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0)
#define pb    push_back
#define int   long long int 
#define nl cout<<"\n"
#define Yes cout<<"YES\n"
#define No cout<<"NO\n"
#define kill(x) {cout << (x) << '\n'; return;}
#define print(a)    cout<<a<<" "
#define pout(a,b)   cout<<a<<" "<<b<<"\n"
#define scan(arr,n) for(int i=0;i<n;i++)    cin>>arr[i];
#define all(a) a.begin(),a.end()
// #define endl "\n"
// #include <ext/pb_ds/assoc_container.hpp>
// #include <ext/pb_ds/tree_policy.hpp>
// using namespace __gnu_pbds;
// template<class T> using oset =tree<T, null_type, less<T>, rb_tree_tag,tree_order_statistics_node_update>;
using namespace std;
const int mod = 1e9 + 7;
const int inf = 1e10;
const long double scale=1e+6; 
bool sortby(const vector<int> & v1,const vector<int> & v2){
    if(v1[1]==v2[1]){
        if(v1[0]==v2[0])
            return v1[2]<v2[2];
        else
            return v1[0]<v2[0];
    }   
    return v1[1]<v2[1];
}
int fpow(int a,int b,int m){
    if(b==0)
        return 1;
    if(b%2!=0)
        return (a*fpow(a,b/2,m)%m*fpow(a,b/2,m))%m;
    else
        return fpow(a,b/2,m)%m*fpow(a,b/2,m)%m;
}

long double expectedRaces(int c,int m,int p,int v)
{
    long double ans = p/scale;
    if(c>0)
    {
        if(c>v)
        {
            if(m>0)
                ans += (c/scale)*(1+expectedRaces(c-v,m+v/2,p+v/2,v));
            else
                ans += (c/scale)*(1+expectedRaces(c-v,0,p+v,v));
        }
        else
        {
            if(m>0)
                ans += (c/scale)*(1+expectedRaces(0,m+c/2,p+c/2,v));
            else
                ans += (c/scale)*(1+expectedRaces(0,0,p+c,v));
        }
    }
    if(m>0)
    {
        if(m>v)
        {
            if(c>0)
                ans += (m/scale)*(1+expectedRaces(c+v/2,m-v,p+v/2,v));
            else
                ans += (m/scale)*(1+expectedRaces(0,m-v,p+v,v));
        }
        else
        {
            if(c>0)
                ans += (m/scale)*(1+expectedRaces(c+m/2,0,p+m/2,v));
            else
                ans += (m/scale)*(1+expectedRaces(0,0,p+m,v));
        }
    }
    return ans;
}
 
void solve()
{
    long double cd,md,pd,vd;
    cin >> cd >> md >> pd >> vd;
    int c = round(cd*scale);
    int m = round(md*scale);
    int p = round(pd*scale);
    int v = round(vd*scale);
    // cout<<c<<" "<<m<<" "<<p<<" "<<v<<endl;
    long double ans = expectedRaces(c,m,p,v);
    cout<<setprecision(12)<<fixed<<ans<<endl;
}   
 
signed main(){fast;
    #ifndef ONLINE_JUDGE
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
    #endif
    // pre();
    int t=1;
    cin>>t;
    while(t--)  solve();
    return 0;
}