#include <cmath>
#include <iomanip>
#include <iostream>
using namespace std;

struct t {
	double x, y;
	t() {
		x = 0;
		y = 0;
	}
	t(double x, double y) {
		this->x = x;
		this->y = y;
	}
	t operator+(t &tt) { return t(this->x + tt.x, this->y + tt.y); }
		
	t operator-(t &tt) { return t(this->x - tt.x, this->y - tt.y); }

	bool operator==(t &p) { return ((x == p.x) && (y == p.y)); }

	bool operator!=(t &p) { return !(*this == p); }

	bool t_is_line_segment(t &t1, t &t2) {
		t t3 = *this;
		t a = t2 - t1;
		t b = t3 - t1;
		double sa = a.x * b.y - b.x * a.y;
		if (sa > 0.0) return false;
		if (sa < 0.0) return false;
		if ((a.x * b.x < 0.0) || (a.y * b.y < 0.0)) return false;
		if (a.length() < b.length()) return false;
		if (t1 == t3) return false;
		if (t2 == t3) return false;
		return true;
	}
	double distance(const t &p) {
		double a = this->x - p.x;
		double b = this->y - p.y;
		return sqrt(a * a + b * b);
	}

	double length(void) { return sqrt(x * x + y * y); }
};

struct line {
	double a, b, c;
	line(const t &t1, const t &t2) {
	a = t1.y - t2.y;
	b = t2.x - t1.x;
	c = t1.x * t2.y - t2.x * t1.y;
	}
};

bool intersect(const line &l1, const line &l2, t &res) {
	if (l1.a * l2.b == l2.a * l1.b)
	return false;
	double g = l1.a * l2.b - l2.a * l1.b;
	res.x = -(l1.c * l2.b - l2.c * l1.b) / g;
	res.y = -(l1.a * l2.c - l2.a * l1.c) / g;
	return true;
}

int main() {

	t x0, x1, x2, x3, m; // m точка пересечения

	double h = 6, answer = 0;

	cin >> x0.x >> x0.y >> x1.x >> x1.y >> x2.x >> x2.y >> x3.x >> x3.y >> h;
	double x0x1_d = x0.distance(x1);
	if (((x3.y - x2.y) * (x0.x - x1.x) - (x3.x - x2.x) * (x0.y - x1.y)) == 0) {
		if (x0.t_is_line_segment(x2, x3)) {
			if (x1.t_is_line_segment(x2, x3)) {
				if (x0x1_d <= h) {
					answer = M_PI * x0x1_d/2;
				} else {
					answer = x0x1_d * asin(h / x0x1_d);
				}
			} else {
				if (x2.t_is_line_segment(x1, x3)) {	
					if (x0x1_d <= h) answer = x0x1_d * asin(x0.distance(x2) / x0x1_d);
					else if (x0x1_d * x0x1_d <= h * h + x0.distance(x2) * x0.distance(x2)){
						answer = x0x1_d * (asin (h / x0x1_d) - acos(x0.distance(x2) / x0x1_d));
					}
				} else {
					if (x0x1_d <= h) answer = x0x1_d * asin(x0.distance(x3) / x0x1_d);
					else if (x0x1_d * x0x1_d <= h * h + x0.distance(x3) * x0.distance(x3)){
						answer = x0x1_d * (asin (h / x0x1_d) - acos(x0.distance(x3) / x0x1_d));
					}
				}
				
			}
		} else {
			double a;
			if (x1.t_is_line_segment(x2, x3)) {
				a = min(x0.distance(x2), x0.distance(x3));
				if (x0x1_d < sqrt(a * a + h * h)) {
					answer = x0x1_d * acos(a / x0x1_d);
				} else {
					answer = x0x1_d * asin(a / x0x1_d);
				}
			} else {
				a = max(x0.distance(x2), x0.distance(x3));
				if (x0x1_d < sqrt(a * a + h * h)) {
					answer = x0x1_d * (asin(h / x0x1_d) - acos(a / x0x1_d));
				}
			}
		}
	} else {
		line l10(x0, x1), l23(x2, x3);
		if (intersect(l10, l23, m)) {
			if (m.t_is_line_segment(x2, x3)) {
				double x0m_d = m.distance(x0);
				answer = sqrt(x0x1_d * x0x1_d - x0m_d * x0m_d);
				if (answer > h) answer = h;
			}
		}
	}
	cout << fixed << setprecision(3) << answer << endl;
	return 0;
}