// Проверок на точность нету. Такое решение не должно проходить при правильных тестах.
uses
	Math;
const
	step = 1 / 1000000;
var
	d, h1, h2, l, t : int64;
	dist, ans, i, max, h : extended;
begin
	reset(input, 'joe.in');
	rewrite(output, 'joe.out');

	read(d, h1, h2, l);
	if (h1 > h2) then begin
		t := h1;
		h1 := h2;
		h2 := t;
	end;

	max := 0;
	i := 0;
	ans := h2;
	while (i <= h1) do begin
		dist := sqrt(d * d + sqr(h2 - i));
		if ((dist <= h2) and (i - h2 + dist <= l)) then begin
			max := i;
			ans := dist;
		end;
		//writeln(i:0:5, ' ', ans:0:5);
		i := i + 1;
	end;

	h := max;
	while ((h <= max + 1) and (h <= h1)) do begin
		dist := sqrt(d * d + sqr(h2 - h));
		if ((dist < h2) and (h - h2 + dist <= l)) then begin
			ans := dist;
		end;
		h := h + step;
	end;
                                     
	writeln((h1 + ans):0:5);
end.