import std;

alias P = Tuple!(double, "x", double, "y");

double radians(double deg) {
    return PI * deg / 180.0;
}

P rotate(P p, double degree) {
    auto rad = radians(degree);
    auto x = p.x * cos(rad) - p.y * sin(rad);
    auto y = p.x * sin(rad) + p.y * cos(rad);
    return P(x, y);
}

double calc(double a, double b, double h, double m) {
    // 短針:
    //     1 周するのに 12 * 60 分
    //     現在の角度 = (60 * h + m) / (12 * 60) * 360
    // 長針:
    //     1 周するのに 60 分
    //     現在の角度 = m / 60 * 360

    auto s = rotate(P(0, a), (60 * h + m) / (12 * 60) * 360);
    auto t = rotate(P(0, b), m / 60 * 360);
    return hypot(s.x - t.x, s.y - t.y);
}

// 複素数を用いた解法
double calc2(double a, double b, double h, double m) {
    auto s = fromPolar(a, (60 * h + m) / (12 * 60) * 2 * PI);
    auto t = fromPolar(b, m / 60 * 2 * PI);
    return abs(s - t);
}

void main() {
    int a, b, h, m; scan(a, b, h, m);
    writefln("%.20f", calc2(a, b, h, m));
}

void scan(T...)(ref T a) {
    string[] ss = readln.split;
    foreach (i, t; T) a[i] = ss[i].to!t;
}
T read(T=string)() { return readln.chomp.to!T; }
T[] reads(T)() { return readln.split.to!(T[]); }
alias readints = reads!int;
