#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define sz(s) (int)(s).size()
#define all(s) s.begin(),s.end()
void Speed() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
}
using point = complex<double>;
istream& operator>>(istream& is, point& p) {
int x, y; // check this
is >> x >> y;
p = point(x, y);
return is;
}
#define PI acos(-1.0L)
#define EPS 1e-8
#define X real()
#define Y imag()
#define length(a) (abs(a))
#define dp(a, b) ((conj(a) * (b)).X)
#define cp(a, b) ((conj(a) * (b)).Y)
#define vec(a,b) ((b)-(a))
#define norm(a) ((a)/length(a))
#define reflectO(v, m) (conj((v) / (m)) * (m))
#define reflect(v, p1, p2) (reflectO(v - p1, p2 - p1) + p1)
#define rotateO(p, ang) ((p) * exp(point(0, ang)))
#define rotate(p, ang, about) (rotateO(p - about, ang) + about)
inline int dcomp(double a, double b) {
return fabs(a - b) < EPS ? 0 : (a > b ? 1 : -1);
}
double angle(const point& a) {
double theta = arg(a);
return (theta < 0 ? (theta + 2 * PI) : theta);
}
bool intersectSegments(const point& a, const point& b, const point& c, const point& d) {
double d1 = cp(vec(b, a), vec(c, d)), d2 = cp(vec(c, a), vec(c, d)), d3 = cp(vec(b, a), vec(c, a));
if (fabs(d1) < EPS)
return false; // Parllel || identical
double t1 = d2 / d1, t2 = d3 / d1;
// point inter = point(a, (b - a) * t1);
if (t1 < -EPS || t1 > 1 + EPS || t2 < -EPS || t2 > 1 + EPS)
return 0;
return 1;
}
bool intersectLines(double A1, double B1, double C1, double A2, double B2, double C2){
double s = A1 * B2 - A2 * B1;
if (fabs(s) < EPS) return 0;
// double x = (-(B2 * C1 - B1 * C2) / (A1 * B2 - A2 * B1));
// double y = ((A2 * C1 - A1 * C2) / (A1 * B2 - A2 * B1));
// inter = point(x, y);
return 1;
}
bool intersectRays(const point& a, const point& b, const point& c, const point& d) {
double d1 = cp(vec(b, a), vec(c, d)), d2 = cp(vec(c, a), vec(c, d)), d3 = cp(vec(b, a), vec(c, a));
if (fabs(d1) < EPS)
return 0; // Parllel || identical
double t1 = d2 / d1, t2 = d3 / d1;
// point inter = a + (b - a) * t1);
if (t1 < -EPS || t2 < -EPS)
return 0;
return 1;
}
double distToLine(const point& v, const point& p1, const point& p2) {
return fabs(cp(vec(v, p1), vec(v, p2)) / length(vec(p1, p2)));
}
double distToRay(const point& v, const point& p1, const point& p2){
if(dp(vec(p1, v), vec(p1, p2)) < 0) return length(vec(v, p1));
return distToLine(v, p1, p2);
}
double distToSeg(const point& v, const point& p1, const point& p2) {
double d1, d2;
const point& v1 = vec(p1, p2), v2 = vec(p1, v);
if ((d1 = dp(v1, v2)) <= 0) return length(vec(v, p1));
if ((d2 = dp(v1, v1)) <= d1) return length(vec(v, p2));
double t = d1 / d2;
return length(vec((p1 + v1 * t), v));
}
double distSegments(const point& a, const point& b, const point& c, const point& d) {
if(intersectSegments(a,b,c,d)) return 0;
return min({distToSeg(a,c,d), distToSeg(b,c,d), distToSeg(c,a,b), distToSeg(d,a,b)});
}
double distRays(const point& a, const point& b, const point& c, const point& d) {
if(intersectRays(a,b,c,d)) return 0;
return min(distToRay(a, c, d), distToRay(c, a, b));
}
array<double, 3> coffLine(const point& a, const point& b){
double A = a.Y - b.Y;
double B = b.X - a.X;
double C = cp(a, b);
if(A < 0) A *= -1, B *= -1, C *= -1;
return {A, B, C};
}
array<point, 2> get_points_on_line(double A, double B, double C){
if(dcomp(A, 0) == 0){
double y = -C / B;
return {point({0, y}), point({1, y})};
}
return {point({-C / A, 0}), point({-(C + B) / A, 1})};
}
bool isCollinear(const point& a, const point& b, const point& p) {
return fabs(cp(vec(a, b), vec(a, p))) < EPS;
}
bool isPointOnRay(const point& a, const point& b, const point& p) {
if(length(vec(a, p)) < EPS) return 1;
return isCollinear(a, b, p) && dcomp(dp(vec(a, b), vec(a, p)), 0) == 1;
}
bool isPointOnSegment(const point& a, const point& b, const point& p) {
return isPointOnRay(a, b, p) && isPointOnRay(b, a, p);
}
void solve(){
point a, b, c, d; cin >> a >> b >> c >> d;
cout << distRays(a, b, c, d) << '\n';
}
int main(){
freopen("raydist.in", "r", stdin);
freopen("raydist.out", "w", stdout);
cout << fixed << setprecision(10);
Speed();
int tc = 1;
//cin >> tc;
while (tc--) {
solve();
}
return 0;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnR5cGVkZWYgbG9uZyBsb25nIGxsOwojZGVmaW5lIHN6KHMpIChpbnQpKHMpLnNpemUoKQojZGVmaW5lIGFsbChzKSBzLmJlZ2luKCkscy5lbmQoKQoKdm9pZCBTcGVlZCgpIHsKICAgIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOwogICAgY2luLnRpZShOVUxMKTsKfQoKdXNpbmcgcG9pbnQgPSBjb21wbGV4PGRvdWJsZT47CmlzdHJlYW0mIG9wZXJhdG9yPj4oaXN0cmVhbSYgaXMsIHBvaW50JiBwKSB7CiAgICBpbnQgeCwgeTsgLy8gY2hlY2sgdGhpcwogICAgaXMgPj4geCA+PiB5OwogICAgcCA9IHBvaW50KHgsIHkpOwogICAgcmV0dXJuIGlzOwp9CgojZGVmaW5lIFBJIGFjb3MoLTEuMEwpCiNkZWZpbmUgRVBTIDFlLTgKI2RlZmluZSBYIHJlYWwoKQojZGVmaW5lIFkgaW1hZygpCiNkZWZpbmUgbGVuZ3RoKGEpIChhYnMoYSkpCiNkZWZpbmUgZHAoYSwgYikgKChjb25qKGEpICogKGIpKS5YKQojZGVmaW5lIGNwKGEsIGIpICgoY29uaihhKSAqIChiKSkuWSkKI2RlZmluZSB2ZWMoYSxiKSAoKGIpLShhKSkKI2RlZmluZSBub3JtKGEpICgoYSkvbGVuZ3RoKGEpKQojZGVmaW5lIHJlZmxlY3RPKHYsIG0pICAgKGNvbmooKHYpIC8gKG0pKSAqIChtKSkKI2RlZmluZSByZWZsZWN0KHYsIHAxLCBwMikgIChyZWZsZWN0Tyh2IC0gcDEsIHAyIC0gcDEpICsgcDEpCiNkZWZpbmUgcm90YXRlTyhwLCBhbmcpICAgKChwKSAqIGV4cChwb2ludCgwLCBhbmcpKSkKI2RlZmluZSByb3RhdGUocCwgYW5nLCBhYm91dCkgIChyb3RhdGVPKHAgLSBhYm91dCwgYW5nKSArIGFib3V0KQoKaW5saW5lIGludCBkY29tcChkb3VibGUgYSwgZG91YmxlIGIpIHsKICAgIHJldHVybiBmYWJzKGEgLSBiKSA8IEVQUyA/IDAgOiAoYSA+IGIgPyAxIDogLTEpOwp9Cgpkb3VibGUgYW5nbGUoY29uc3QgcG9pbnQmIGEpIHsKICAgIGRvdWJsZSB0aGV0YSA9IGFyZyhhKTsKICAgIHJldHVybiAodGhldGEgPCAwID8gKHRoZXRhICsgMiAqIFBJKSA6IHRoZXRhKTsKfQoKCgpib29sIGludGVyc2VjdFNlZ21lbnRzKGNvbnN0IHBvaW50JiBhLCBjb25zdCBwb2ludCYgYiwgY29uc3QgcG9pbnQmIGMsIGNvbnN0IHBvaW50JiBkKSB7CiAgICBkb3VibGUgZDEgPSBjcCh2ZWMoYiwgYSksIHZlYyhjLCBkKSksIGQyID0gY3AodmVjKGMsIGEpLCB2ZWMoYywgZCkpLCBkMyA9IGNwKHZlYyhiLCBhKSwgdmVjKGMsIGEpKTsKICAgIGlmIChmYWJzKGQxKSA8IEVQUykKICAgICAgICByZXR1cm4gZmFsc2U7IC8vIFBhcmxsZWwgfHwgaWRlbnRpY2FsCiAgICBkb3VibGUgdDEgPSBkMiAvIGQxLCB0MiA9IGQzIC8gZDE7CiAgICAvLyBwb2ludCBpbnRlciA9IHBvaW50KGEsIChiIC0gYSkgKiB0MSk7CiAgICBpZiAodDEgPCAtRVBTIHx8IHQxID4gMSArIEVQUyB8fCB0MiA8IC1FUFMgfHwgdDIgPiAxICsgRVBTKQogICAgICAgIHJldHVybiAwOyAKICAgIHJldHVybiAxOwp9Cgpib29sIGludGVyc2VjdExpbmVzKGRvdWJsZSBBMSwgZG91YmxlIEIxLCBkb3VibGUgQzEsIGRvdWJsZSBBMiwgZG91YmxlIEIyLCBkb3VibGUgQzIpewogICAgZG91YmxlIHMgPSBBMSAqIEIyIC0gQTIgKiBCMTsKICAgIGlmIChmYWJzKHMpIDwgRVBTKSByZXR1cm4gMDsKICAgIC8vIGRvdWJsZSB4ID0gKC0oQjIgKiBDMSAtIEIxICogQzIpIC8gKEExICogQjIgLSBBMiAqIEIxKSk7CiAgICAvLyBkb3VibGUgeSA9ICgoQTIgKiBDMSAtIEExICogQzIpIC8gKEExICogQjIgLSBBMiAqIEIxKSk7CiAgICAvLyBpbnRlciA9IHBvaW50KHgsIHkpOwogICAgcmV0dXJuIDE7Cn0KCmJvb2wgaW50ZXJzZWN0UmF5cyhjb25zdCBwb2ludCYgYSwgY29uc3QgcG9pbnQmIGIsIGNvbnN0IHBvaW50JiBjLCBjb25zdCBwb2ludCYgZCkgewogICAgZG91YmxlIGQxID0gY3AodmVjKGIsIGEpLCB2ZWMoYywgZCkpLCBkMiA9IGNwKHZlYyhjLCBhKSwgdmVjKGMsIGQpKSwgZDMgPSBjcCh2ZWMoYiwgYSksIHZlYyhjLCBhKSk7CiAgICBpZiAoZmFicyhkMSkgPCBFUFMpCiAgICAgICAgcmV0dXJuIDA7IC8vIFBhcmxsZWwgfHwgaWRlbnRpY2FsCiAgICBkb3VibGUgdDEgPSBkMiAvIGQxLCB0MiA9IGQzIC8gZDE7CiAgICAvLyBwb2ludCBpbnRlciA9IGEgKyAoYiAtIGEpICogdDEpOwogICAgaWYgKHQxIDwgLUVQUyB8fCB0MiA8IC1FUFMpCiAgICAgICAgcmV0dXJuIDA7IAogICAgcmV0dXJuIDE7Cn0KCgoKZG91YmxlIGRpc3RUb0xpbmUoY29uc3QgcG9pbnQmIHYsIGNvbnN0IHBvaW50JiBwMSwgY29uc3QgcG9pbnQmIHAyKSB7CiAgICByZXR1cm4gZmFicyhjcCh2ZWModiwgcDEpLCB2ZWModiwgcDIpKSAvIGxlbmd0aCh2ZWMocDEsIHAyKSkpOwp9Cgpkb3VibGUgZGlzdFRvUmF5KGNvbnN0IHBvaW50JiB2LCBjb25zdCBwb2ludCYgcDEsIGNvbnN0IHBvaW50JiBwMil7CiAgICBpZihkcCh2ZWMocDEsIHYpLCB2ZWMocDEsIHAyKSkgPCAwKSByZXR1cm4gbGVuZ3RoKHZlYyh2LCBwMSkpOwogICAgcmV0dXJuIGRpc3RUb0xpbmUodiwgcDEsIHAyKTsKfQoKZG91YmxlIGRpc3RUb1NlZyhjb25zdCBwb2ludCYgdiwgY29uc3QgcG9pbnQmIHAxLCBjb25zdCBwb2ludCYgcDIpIHsKICAgIGRvdWJsZSBkMSwgZDI7CiAgICBjb25zdCBwb2ludCYgdjEgPSB2ZWMocDEsIHAyKSwgdjIgPSB2ZWMocDEsIHYpOwogICAgaWYgKChkMSA9IGRwKHYxLCB2MikpIDw9IDApIHJldHVybiBsZW5ndGgodmVjKHYsIHAxKSk7CiAgICBpZiAoKGQyID0gZHAodjEsIHYxKSkgPD0gZDEpIHJldHVybiBsZW5ndGgodmVjKHYsIHAyKSk7CiAgICBkb3VibGUgdCA9IGQxIC8gZDI7CiAgICByZXR1cm4gbGVuZ3RoKHZlYygocDEgKyB2MSAqIHQpLCB2KSk7Cn0KIApkb3VibGUgZGlzdFNlZ21lbnRzKGNvbnN0IHBvaW50JiBhLCBjb25zdCBwb2ludCYgYiwgY29uc3QgcG9pbnQmIGMsIGNvbnN0IHBvaW50JiBkKSB7CiAgICBpZihpbnRlcnNlY3RTZWdtZW50cyhhLGIsYyxkKSkgcmV0dXJuIDA7CiAgICByZXR1cm4gbWluKHtkaXN0VG9TZWcoYSxjLGQpLCBkaXN0VG9TZWcoYixjLGQpLCBkaXN0VG9TZWcoYyxhLGIpLCBkaXN0VG9TZWcoZCxhLGIpfSk7Cn0KCmRvdWJsZSBkaXN0UmF5cyhjb25zdCBwb2ludCYgYSwgY29uc3QgcG9pbnQmIGIsIGNvbnN0IHBvaW50JiBjLCBjb25zdCBwb2ludCYgZCkgewogICAgaWYoaW50ZXJzZWN0UmF5cyhhLGIsYyxkKSkgcmV0dXJuIDA7CiAgICByZXR1cm4gbWluKGRpc3RUb1JheShhLCBjLCBkKSwgZGlzdFRvUmF5KGMsIGEsIGIpKTsKfQoKYXJyYXk8ZG91YmxlLCAzPiBjb2ZmTGluZShjb25zdCBwb2ludCYgYSwgY29uc3QgcG9pbnQmIGIpewogICAgZG91YmxlIEEgPSBhLlkgLSBiLlk7CiAgICBkb3VibGUgQiA9IGIuWCAtIGEuWDsKICAgIGRvdWJsZSBDID0gY3AoYSwgYik7CiAgICBpZihBIDwgMCkgQSAqPSAtMSwgQiAqPSAtMSwgQyAqPSAtMTsKICAgIHJldHVybiB7QSwgQiwgQ307Cn0KCmFycmF5PHBvaW50LCAyPiBnZXRfcG9pbnRzX29uX2xpbmUoZG91YmxlIEEsIGRvdWJsZSBCLCBkb3VibGUgQyl7CiAgICBpZihkY29tcChBLCAwKSA9PSAwKXsKICAgICAgICBkb3VibGUgeSA9IC1DIC8gQjsKICAgICAgICByZXR1cm4ge3BvaW50KHswLCB5fSksIHBvaW50KHsxLCB5fSl9OwogICAgfQogICAgcmV0dXJuIHtwb2ludCh7LUMgLyBBLCAwfSksIHBvaW50KHstKEMgKyBCKSAvIEEsIDF9KX07Cn0KCmJvb2wgaXNDb2xsaW5lYXIoY29uc3QgcG9pbnQmIGEsIGNvbnN0IHBvaW50JiBiLCBjb25zdCBwb2ludCYgcCkgewogICAgcmV0dXJuIGZhYnMoY3AodmVjKGEsIGIpLCB2ZWMoYSwgcCkpKSA8IEVQUzsKfQoKYm9vbCBpc1BvaW50T25SYXkoY29uc3QgcG9pbnQmIGEsIGNvbnN0IHBvaW50JiBiLCBjb25zdCBwb2ludCYgcCkgewogICAgaWYobGVuZ3RoKHZlYyhhLCBwKSkgPCBFUFMpIHJldHVybiAxOwogICAgcmV0dXJuIGlzQ29sbGluZWFyKGEsIGIsIHApICYmIGRjb21wKGRwKHZlYyhhLCBiKSwgdmVjKGEsIHApKSwgMCkgPT0gMTsKfQoKYm9vbCBpc1BvaW50T25TZWdtZW50KGNvbnN0IHBvaW50JiBhLCBjb25zdCBwb2ludCYgYiwgY29uc3QgcG9pbnQmIHApIHsKICAgIHJldHVybiBpc1BvaW50T25SYXkoYSwgYiwgcCkgJiYgaXNQb2ludE9uUmF5KGIsIGEsIHApOwp9Cgp2b2lkIHNvbHZlKCl7CiAgICBwb2ludCBhLCBiLCBjLCBkOyBjaW4gPj4gYSA+PiBiID4+IGMgPj4gZDsKICAgIGNvdXQgPDwgZGlzdFJheXMoYSwgYiwgYywgZCkgPDwgJ1xuJzsKfQoKaW50IG1haW4oKXsKICAgIGZyZW9wZW4oInJheWRpc3QuaW4iLCAiciIsIHN0ZGluKTsKICAgIGZyZW9wZW4oInJheWRpc3Qub3V0IiwgInciLCBzdGRvdXQpOwogICAgY291dCA8PCBmaXhlZCA8PCBzZXRwcmVjaXNpb24oMTApOwogICAgU3BlZWQoKTsKICAgIGludCB0YyA9IDE7CiAgICAvL2NpbiA+PiB0YzsKICAgIHdoaWxlICh0Yy0tKSB7CiAgICAgICAgc29sdmUoKTsKICAgIH0KICAgIHJldHVybiAwOwp9