/* Author:bhagatsunny96
         JGEC
	   template__
	lets_code_it_ */
#include <bits/stdc++.h>
#define mp make_pair
#define pb push_back
#define ll long long int 
#define ld long double
#define fi first
#define se second
#define mod 1000000007
#define test long long int t; cin>>t; while(t-->0)
#define fIO ios_base::sync_with_stdio(false); cin.tie(NULL);
#define loop(n) for(long long int i=0;i<n;i++)
#define loopr(n) for(long long int i=n-1;i>=0;i--)
#define lrp(a,b) for(long long int i=a;i<=b;i++)
#define lrn(a,b) for(long long int i=b;i>=a;i--)
#define endl '\n'
#define ivec vector<ll>
#define ivecp vector<pair<ll,ll>>
#define imap map<ll,ll>
#define uimap unordered_map<ll,ll>
#define iset set<ll>
#define cvec vector<char>
#define civecp vector<pair<char,ll>>
#define cimap map<char,ll>
#define ucimap unordered_map<char,ll>
#define cset set<char>
#define rr return 0
using namespace std;
//Declaration
const ll N=5e5+5;
vector<ll>adj[N];
bool visited[N]={false};
ll parent[N];
ll rnk[N];
ll degree[N];
vector<ll>ax;



//Function call
bool isprime(ll n);
bool ispalin(ll num);
ll lcm(ll a, ll b); 
ll power(ll x, unsigned ll y);
ll gcd(ll a, ll b);
ll sumofdigits(ll n);
void sorts(string &str);
bool sortinrev(const pair<ll,ll>&a,const pair<ll,ll>&b);
bool sortbysec(const pair<ll,ll> &a, const pair<ll,ll> &b);
void countSort(ll arr[], ll n, ll exp);
void radixsort(ll arr[], ll n);
void print(ll arr[], ll n);
void make(ll a);
ll find(ll a);
void Union(ll a,ll b);
double calcAngle(ll h,ll m);
double min(double x,double y);



//solve
void solve()
{
    ll a,b,h,m;
    cin>>a>>b>>h>>m;
    double ang=calcAngle(h,m);
    double ax=cos(3.141592653589793238*ang/180);
    double am=pow(a,2)+pow(b,2)-(2*a*b*ax);
    cout<<fixed<<setprecision(20)<<sqrt(am)<<endl;
}










//--------------------------------------------------------------------------------------------------//
//Functions
double min(double x, double y)  
{  
    return (x < y)? x: y;  
      
}  
  
double calcAngle(ll h, ll m)  
{  
  
    if (h == 12) h = 0;  
    if (m == 60) m = 0;  
  
    // Calculate the angles moved  
    // by hour and minute hands  
    // with reference to 12:00  
    double hour_angle = 0.5 * (h * 60 + m);  
    double minute_angle = 6 * m;  
  
    // Find the difference between two angles  
    double angle = abs(hour_angle - minute_angle);  
  
    // Return the smaller angle of two possible angles  
    angle = min(360 - angle, angle);  
  
    return angle;  
}  
ll gcd(ll a, ll b)
{ 
    if (b == 0) 
        return a; 
    return gcd(b, a % b);
}
ll lcm(ll a, ll b)  
{  
    return (a*b)/__gcd(a, b);  
}
ll power(ll x, unsigned ll y) 
{ 
    ll temp; 
    if( y == 0) 
        return 1; 
    temp = power(x, y/2); 
    if (y%2 == 0) 
        return temp*temp; 
    else
        return x*temp*temp; 
}
bool isPrime(ll num)
{
    bool flag=true;
    for(ll i =2;i<=num/2;i++) 
    {
       if(num%i==0) 
       {
          flag=false;
          break;
       }
    }
    return flag;
}
bool isPalin(ll num)
{
    bool flag=false;
    ll digit,rev=0,n=num;
    do
     {
         digit = num % 10;
         rev = (rev * 10) + digit;
         num = num / 10;
     } while (num != 0);
     if(rev==n)
     flag=true;
     return flag;
}
ll sumofdigits(ll n)
{
    ll c=0;
    while(n>0)
    {
        c++;
        n/=10;
    }
    return c;
}
bool sortinrev(const pair<ll,ll>&a,const pair<ll,ll>&b) 
{ 
    return (a.first > b.first); 
}
bool sortbysec(const pair<ll,ll> &a, const pair<ll,ll> &b) 
{ 
    return (a.second < b.second); 
}
string sortString(string &str) 
{ 
   sort(str.begin(), str.end()); 
   return str;
} 
void countSort(ll arr[], ll n, ll exp) 
{ 
	ll output[n];
	ll i, count[10] = {0}; 
	for (i = 0; i < n; i++) 
		count[ (arr[i]/exp)%10 ]++; 
	for (i = 1; i < 10; i++) 
		count[i] += count[i - 1]; 
	for (i = n - 1; i >= 0; i--) 
	{ 
		output[count[ (arr[i]/exp)%10 ] - 1] = arr[i]; 
		count[ (arr[i]/exp)%10 ]--; 
	} 
	for (i = 0; i < n; i++) 
		arr[i] = output[i]; 
} 
void radixsort(ll arr[], ll n) 
{
    ll mx = arr[0]; 
	for (ll i = 1; i < n; i++) 
		if (arr[i] > mx) 
			mx = arr[i];
	ll m =mx;
	for (ll exp = 1; m/exp > 0; exp *= 10) 
		countSort(arr, n, exp); 
} 
void print(ll arr[], ll n) 
{ 
    for (ll i = 0; i < n; i++) 
        cout << arr[i] << " "; 
}
//DSU//
void make(ll a)
{
    parent[a]=a;
    rnk[a]=1;
}
ll find(ll a)
{
    if(parent[a]==a)
    return a;
    return parent[a]=find(parent[a]);
}
void Union(ll a,ll b)
{
    a=find(a);
    b=find(b);
    if(a==b)
    return;
    if(rnk[a]>rnk[b])
    {
        parent[b]=a;
        rnk[a]+=rnk[b];
    }
    else
    {
        parent[a]=b;
        rnk[b]+=rnk[a];
    }
}




//Driver Code
int main() 
{
    
    solve();
	rr;
}

Measured memory_bytes: 15892