#include <bits/stdc++.h>

#define TYPE(c)   remove_reference_t<decltype(c)>
#define REP(i, n) for(TYPE(n) i = 0; i < n; i++)
#define FOR(v, c) for(TYPE(c.begin()) v = c.begin(); v != c.end(); v++)
#define ALL(c)    c.begin(), c.end()
#define SORT(c)   sort(ALL(c))
#define RSORT(c)  sort(ALL(c), greater<TYPE(c)::value_type>())
#define UNIQUE(c) c.erase(unique(ALL(c)), c.end())

using namespace std;
using ll = long long;

constexpr int MOD  = (int)1e9 + 7;
constexpr int INF  = (int)1e9 + 1;
constexpr ll  LINF = (ll)1e18 + 1;
template<typename T> constexpr bool chmax(T& a, const T& b)
{ if(a < b) { a = b; return true; } else { return false; } }
template<typename T> constexpr bool chmin(T& a, const T& b)
{ if(b < a) { a = b; return true; } else { return false; } }
template<typename S, typename T> ostream& operator<<(ostream &os, const pair<S, T>& p)
{ return os << "(" << p.first << "," << p.second << ")"; }
template<typename T> auto operator<<(ostream& os, const T& t)
    -> typename conditional<true, ostream&, decltype(*t.begin())>::type
{ os << "["; FOR(v, t) { if(v != t.begin()) os << ","; os << *v; } os << "]"; return os; }

/**
 *  二次元空間における点を表すクラス
 */
template<typename T>
class Pt {
public:
    T x, y;
    constexpr Pt() : x(0), y(0) { }
    constexpr Pt(const T& _x, const T& _y) : x(_x), y(_y) { }
    constexpr Pt(const Pt &obj) : x(obj.x), y(obj.y) { }
    Pt &operator=(const Pt &obj) { x = obj.x; y = obj.y; return *this; }

    double norm() const { return std::sqrt(dot(*this)); }
    constexpr double dot(const Pt& other) const { return x * other.x + y * other.y; }
    constexpr double distanceFrom(const Pt& other) const { return (other - *this).norm(); }
    constexpr Pt normalized() const { return *this / norm(); }
    constexpr bool isZero() const { return x == 0 && y == 0; }
    template<typename S>
    constexpr bool isWithinRange(const S& w, const S& h) const { return 0 <= x && x < w && 0 <= y && y < h; }

    constexpr Pt operator +() const { return *this; }
    constexpr Pt operator -() const { return{ -x, -y }; }
    constexpr Pt operator +(const Pt& other) const { return{ x + other.x, y + other.y }; }
    constexpr Pt operator +=(const Pt& other) { x += other.x;  y += other.y;  return *this; }
    constexpr Pt operator -(const Pt& other) const { return{ x - other.x, y - other.y }; }
    constexpr Pt operator -=(const Pt& other) { x -= other.x;  y -= other.y;  return *this; }
    template<typename S> constexpr Pt operator *(S s) const { return{ x * s, y * s }; }
    constexpr Pt operator *=(const Pt& other) { x *= other.x;  y *= other.y;  return *this; }
    template<typename S> constexpr Pt operator /(S s) const { return{ x / s, y / s }; }
    constexpr Pt operator /=(const Pt& other) { x /= other.x;  y /= other.y;  return *this; }
    constexpr bool operator ==(const Pt& other) { return x == other.x && y == other.y; }
    constexpr bool operator !=(const Pt& other) { return !(x == other.x && y == other.y); }

    void stdRead() { std::cin >> x >> y; }

    friend std::ostream& operator <<(std::ostream& os, const Pt& obj) {
        os << "(x : " << obj.x << ", " << "y : " << obj.y << ")";
        return os;
    }
};

/**
 *  多角形を表すクラス
 *  NOTE: dependencies: comp-pt
 */
template<typename T>
class Polygon {
public:
    explicit Polygon(const int& point_num) :
        vertices_(std::vector<Pt<T>>(point_num)),
        length_of_edges_(std::vector<double>(point_num)) {
        calcLengthOfEdges();
    }
    Polygon(const std::vector<Pt<T>>& vertices) :
        vertices_(vertices),
        length_of_edges_(std::vector<double>(vertices_.size())) {
        calcLengthOfEdges();
    }
    template<typename ... A> Polygon(const A&... pts) :
        vertices_(std::initializer_list<Pt<T>>{pts...}),
        length_of_edges_(std::vector<double>(vertices_.size())) {
        calcLengthOfEdges();
    }

    const std::vector<Pt<T>>& getVertices() const { return vertices_; }
    const std::vector<double>& getLengthOfEdges() const { return length_of_edges_; }

    void stdRead() {
        for(auto& v : vertices_) v.stdRead();
        calcLengthOfEdges();
    }

    double calcArea() const {
        double ret = 0;
        for(size_t i = 0; i < vertices_.size(); i++) {
            size_t j = (i != vertices_.size() - 1) ? i + 1 : 0;
            ret += (vertices_[i].x - vertices_[j].x) * (vertices_[i].y + vertices_[j].y);
        }
        return std::abs(ret / 2.0);
    }

private:
    std::vector<Pt<T>>  vertices_;         // 頂点は順番に格納
    std::vector<double> length_of_edges_;  // i番目にvertices_[i]からvertices_[i + 1]の長さを格納

    void calcLengthOfEdges() {
        for(size_t i = 0; i < vertices_.size(); i++) {
            size_t j = (i != vertices_.size() - 1) ? i + 1 : 0;
            length_of_edges_[i] = vertices_[i].distanceFrom(vertices_[j]);
        }
    }
};

int main() {
    cin.tie(0);
    ios::sync_with_stdio(false);

    Polygon<double> pol(3);
    pol.stdRead();

    auto& edge = pol.getLengthOfEdges();
    auto  h    = 2 * pol.calcArea() / accumulate(ALL(edge), 0.0);
    auto  max  = *max_element(ALL(edge));

    std::cout << std::setprecision(20) << max * h / (max + 2 * h) << std::endl;

    return 0;
}


Measured memory_bytes: 256