#include<bits/stdc++.h> using namespace std; struct cww{ cww(){ ios::sync_with_stdio(false);cin.tie(0); cout<<fixed<<setprecision(20); } }init; typedef double D; typedef vector<D> VD; typedef vector<VD> VVD; D vecmul(const VD a,const VD b){ D res=0; int size=a.size(); for(int i=0;i<size;i++) res+=a[i]*b[i]; return res; } VD matmul(const VVD a,const VD b){ int sz=a.size(); VD res(sz,0.0); for(int i=0;i<sz;i++) for(int j=0;j<sz;j++) res[i]+=a[i][j]*b[j]; return res; } VVD matmul(const VVD a,const VVD b){ int sz=a.size(); VVD res(sz,VD(sz,0.0)); for(int i=0;i<sz;i++) for(int j=0;j<sz;j++) for(int k=0;k<sz;k++) res[i][j]+=a[i][k]*b[k][j]; return res; } VD nxt(D p){ D a=3/(1-p); D b=-a*(p/2); return {a,b,b-1}; } VD prv(D p){ D a=2/p; D b=-a*((1-p)/3); return {a,b,b-1}; } const D eps=1e-9; int main(){ D p,q,a,b,c,d,s,p1,p0,ps,res; cin>>p>>q; //q==0だけ場合分け if(q==0){ res=(p+2)/(4-p); } else{ //p1=a*p0+bを求める { VD x={3,1,0}; VD y={-1,0,1}; D t=q; while(t<1){ D nt=min(t+q,1.0); VVD mat={nxt(t),{1.0,0.0,0.0},{0.0,0.0,1.0}}; x=matmul(mat,x); y=matmul(mat,y); t=nt; } a=x[0];b=y[0]; } //p0=c*p1+dを求める { VD x={2,1,0}; VD y={-1,0,1}; D t=1-q; while(t>0){ D nt=max(t-q,0.0); VVD mat={prv(t),{1.0,0.0,0.0},{0.0,0.0,1.0}}; x=matmul(mat,x); y=matmul(mat,y); t=nt; } c=x[0];d=y[0]; } //cout<<a<<" "<<b<<" "<<c<<" "<<d<<endl; //p0とp1がa,b,c,dから求まる p1=(a*d+b)/(1-a*c); p0=(c*p1+d); //cout<<"p0="<<p0<<endl; // cout<<"p1="<<p1<<endl; s=p; while(s-q>0)s-=q; { VVD m={{1.0,0.0,0.0},{0.0,1.0,0.0},{0.0,0.0,1.0}}; D ss=s; while(ss<1){ D nss=min(ss+q,1.0); m=matmul({nxt(ss),{1.0,0.0,0.0},{0.0,0.0,1.0}},m); ss=nss; } ps=(p1-m[0][1]*p0-m[0][2])/m[0][0]; } //cout<<"ps="<<ps<<endl; { VVD m={{1.0,0.0,0.0},{0.0,1.0,0.0},{0.0,0.0,1.0}}; D ss=s; while(ss<p){ D nss=min(ss+q,1.0); m=matmul({nxt(ss),{1.0,0.0,0.0},{0.0,0.0,1.0}},m); ss=nss; } res=m[0][0]*ps+m[0][1]*p0+m[0][2]; } } cout<<1.0/3+res/3.0<<endl; return 0; }