import std.stdio, std.string, std.conv;
import std.range, std.algorithm, std.array, std.typecons;
import std.math, std.numeric;



void main() {
    auto x = new real[](3);
    auto y = new real[](3);
    foreach (i ; 0 .. 3) {
        int xi, yi; scan(xi, yi);
        x[i] = xi, y[i] = yi;
    }
    auto a = sqrt((x[0] - x[1])^^2 + (y[0] - y[1])^^2);
    auto b = sqrt((x[1] - x[2])^^2 + (y[1] - y[2])^^2);
    auto c = sqrt((x[2] - x[0])^^2 + (y[2] - y[0])^^2);
    auto S = sqrt((a+b+c)*(a-b+c)*(b-c+a)*(c-a+b)) / 4.0;
    auto r = 2.0 * S / (a + b + c);

    real btm = 0, top = r;

    bool check(real x) {
        return (1 - x / r) * max(a, b, c) >= 2*x;
    }

    foreach (_ ; 0 .. 10^^5) {
        real mid = (btm + top) / 2;
        if (check(mid)) {
            btm = mid;
        }
        else {
            top = mid;
        }
    }

    writefln("%.12f", btm);
}




void scan(T...)(ref T args) {
    import std.stdio : readln;
    import std.algorithm : splitter;
    import std.conv : to;
    import std.range.primitives;

    auto line = readln().splitter();
    foreach (ref arg; args) {
        arg = line.front.to!(typeof(arg));
        line.popFront();
    }
    assert(line.empty);
}



void fillAll(R, T)(ref R arr, T value) {
    static if (is(typeof(arr[] = value))) {
        arr[] = value;
    }
    else {
        foreach (ref e; arr) {
            fillAll(e, value);
        }
    }
}
