int main() {
  double a, b, c, s, area, pre_area;
  double m1, m2, m3;
  while (scanf("%lf %lf %lf", &m1, &m2, &m3) == 3) {
    a = (2 * sqrt((2 * (m2) * (m2)) + (2 * (m3) * (m3)) + (-(m1) * (m1)))) / 3;
    b = (2 * sqrt((-(m2) * (m2)) + (2 * (m3) * (m3)) + (2 * (m1) * (m1)))) / 3;
    c = (2 * sqrt((2 * (m2) * (m2)) + (-(m3) * (m3)) + (2 * (m1) * (m1)))) / 3;
    s = (a + b + c) / 2;
    pre_area = s * (s - a) * (s - b) * (s - c);
    if (pre_area > 0) {
      area = sqrt(pre_area);
      printf("%.3lf\n", area);
    } else {
      printf("-1.000\n");
    }
  }
  return 0;
}


x86 assembly (clang, -O0):
<main>:
push   %rbp
mov    %rsp,%rbp
sub    $0x50,%rsp
movl   $0x0,-0x4(%rbp)
lea    0xeca(%rip),%rdi
lea    -0x40(%rbp),%rsi
lea    -0x48(%rbp),%rdx
lea    -0x50(%rbp),%rcx
mov    $0x0,%al
call   1040 <scanf@plt>
cmp    $0x3,%eax
jne    1370 <main+0x240>
movsd  0xe96(%rip),%xmm1
mulsd  -0x48(%rbp),%xmm1
movsd  -0x48(%rbp),%xmm2
movsd  0xe84(%rip),%xmm0
mulsd  -0x50(%rbp),%xmm0
mulsd  -0x50(%rbp),%xmm0
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  -0x40(%rbp),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
movsd  -0x40(%rbp),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
call   1050 <sqrt@plt>
movaps %xmm0,%xmm1
movsd  0xe39(%rip),%xmm0
mulsd  %xmm1,%xmm0
movsd  0xe35(%rip),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x10(%rbp)
movsd  -0x48(%rbp),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
movsd  -0x48(%rbp),%xmm2
movsd  0xdfb(%rip),%xmm0
mulsd  -0x50(%rbp),%xmm0
mulsd  -0x50(%rbp),%xmm0
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  0xde1(%rip),%xmm0
mulsd  -0x40(%rbp),%xmm0
movsd  -0x40(%rbp),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
call   1050 <sqrt@plt>
movaps %xmm0,%xmm1
movsd  0xdbf(%rip),%xmm0
mulsd  %xmm1,%xmm0
movsd  0xdbb(%rip),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x18(%rbp)
movsd  0xda2(%rip),%xmm1
mulsd  -0x48(%rbp),%xmm1
movsd  -0x48(%rbp),%xmm2
movsd  -0x50(%rbp),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  -0x50(%rbp),%xmm0
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  0xd67(%rip),%xmm0
mulsd  -0x40(%rbp),%xmm0
movsd  -0x40(%rbp),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
call   1050 <sqrt@plt>
movaps %xmm0,%xmm1
movsd  0xd45(%rip),%xmm0
mulsd  %xmm1,%xmm0
movsd  0xd41(%rip),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x20(%rbp)
movsd  -0x10(%rbp),%xmm0
addsd  -0x18(%rbp),%xmm0
addsd  -0x20(%rbp),%xmm0
movsd  0xd19(%rip),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x28(%rbp)
movsd  -0x28(%rbp),%xmm0
movsd  -0x28(%rbp),%xmm1
subsd  -0x10(%rbp),%xmm1
mulsd  %xmm1,%xmm0
movsd  -0x28(%rbp),%xmm1
subsd  -0x18(%rbp),%xmm1
mulsd  %xmm1,%xmm0
movsd  -0x28(%rbp),%xmm1
subsd  -0x20(%rbp),%xmm1
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  -0x38(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jbe    135d <main+0x22d>
movsd  -0x38(%rbp),%xmm0
call   1050 <sqrt@plt>
movsd  %xmm0,-0x30(%rbp)
movsd  -0x30(%rbp),%xmm0
lea    0xccb(%rip),%rdi
mov    $0x1,%al
call   1030 <printf@plt>
jmp    136b <main+0x23b>
lea    0xcbf(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
jmp    113f <main+0xf>
xor    %eax,%eax
add    $0x50,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<main>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x38,%rsp
lea    0xedb(%rip),%rdi
lea    0x10(%rsp),%rsi
lea    0x8(%rsp),%rdx
mov    %rsp,%rcx
xor    %eax,%eax
call   1050 <scanf@plt>
cmp    $0x3,%eax
jne    1354 <main+0x214>
lea    0xec3(%rip),%r14
lea    0xeb0(%rip),%r15
lea    0x10(%rsp),%r12
lea    0x8(%rsp),%r13
mov    %rsp,%rbx
lea    0xeaf(%rip),%rbp
jmp    11c4 <main+0x84>
cs nopw 0x0(%rax,%rax,1)
mov    %rbp,%rdi
call   1030 <puts@plt>
mov    %r15,%rdi
mov    %r12,%rsi
mov    %r13,%rdx
mov    %rbx,%rcx
xor    %eax,%eax
call   1050 <scanf@plt>
cmp    $0x3,%eax
jne    1354 <main+0x214>
movsd  0x8(%rsp),%xmm1
movapd %xmm1,%xmm0
addsd  %xmm1,%xmm0
movsd  (%rsp),%xmm2
movapd %xmm2,%xmm3
addsd  %xmm2,%xmm3
mulsd  %xmm2,%xmm3
mulsd  %xmm1,%xmm0
addsd  %xmm3,%xmm0
movsd  0x10(%rsp),%xmm1
mulsd  %xmm1,%xmm1
subsd  %xmm1,%xmm0
ucomisd 0xe0f(%rip),%xmm0
jb     1210 <main+0xd0>
xorps  %xmm3,%xmm3
sqrtsd %xmm0,%xmm3
jmp    1219 <main+0xd9>
nopl   0x0(%rax)
call   1060 <sqrt@plt>
movapd %xmm0,%xmm3
addsd  %xmm3,%xmm3
divsd  0xddb(%rip),%xmm3
movsd  0x8(%rsp),%xmm0
movsd  (%rsp),%xmm1
movapd %xmm1,%xmm2
addsd  %xmm1,%xmm2
mulsd  %xmm1,%xmm2
mulsd  %xmm0,%xmm0
subsd  %xmm0,%xmm2
movsd  0x10(%rsp),%xmm1
movapd %xmm1,%xmm0
addsd  %xmm1,%xmm0
mulsd  %xmm1,%xmm0
addsd  %xmm2,%xmm0
ucomisd 0xdae(%rip),%xmm0
movsd  %xmm3,0x18(%rsp)
jb     1270 <main+0x130>
sqrtsd %xmm0,%xmm4
jmp    1279 <main+0x139>
call   1060 <sqrt@plt>
movapd %xmm0,%xmm4
movsd  0x8(%rsp),%xmm0
movapd %xmm0,%xmm1
addsd  %xmm0,%xmm1
movsd  (%rsp),%xmm2
mulsd  %xmm2,%xmm2
mulsd  %xmm0,%xmm1
subsd  %xmm2,%xmm1
movsd  0x10(%rsp),%xmm2
movapd %xmm2,%xmm0
addsd  %xmm2,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
ucomisd 0xd5a(%rip),%xmm0
jb     12c0 <main+0x180>
sqrtsd %xmm0,%xmm0
jmp    12d1 <main+0x191>
xchg   %ax,%ax
movapd %xmm4,0x20(%rsp)
call   1060 <sqrt@plt>
movapd 0x20(%rsp),%xmm4
movsd  0x18(%rsp),%xmm3
unpcklpd %xmm4,%xmm0
addpd  %xmm0,%xmm0
divpd  0xd39(%rip),%xmm0
movapd %xmm0,%xmm1
unpckhpd %xmm0,%xmm1
addsd  %xmm3,%xmm1
addsd  %xmm0,%xmm1
mulsd  0xd09(%rip),%xmm1
movapd %xmm1,%xmm2
subsd  %xmm3,%xmm2
mulsd  %xmm1,%xmm2
unpcklpd %xmm1,%xmm1
subpd  %xmm0,%xmm1
movapd %xmm1,%xmm0
unpckhpd %xmm1,%xmm0
mulsd  %xmm2,%xmm0
mulsd  %xmm1,%xmm0
ucomisd 0xce5(%rip),%xmm0
jbe    11a0 <main+0x60>
jb     1340 <main+0x200>
sqrtsd %xmm0,%xmm0
jmp    1345 <main+0x205>
nopl   0x0(%rax)
call   1060 <sqrt@plt>
mov    %r14,%rdi
mov    $0x1,%al
call   1040 <printf@plt>
jmp    11a8 <main+0x68>
xor    %eax,%eax
add    $0x38,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
@.str = [12 x i8] c"%lf %lf %lf\00"
@.str.1 = [7 x i8] c"%.3lf\0A\00"
@.str.2 = [8 x i8] c"-1.000\0A\00"
define i32 @main() {
%1 = alloca i32
%2 = alloca double
%3 = alloca double
%4 = alloca double
%5 = alloca double
%6 = alloca double
%7 = alloca double
%8 = alloca double
%9 = alloca double
%10 = alloca double
store i32 0, i32* %1
br label %11
11: ; preds = %88, %0
%12 = call i32 (i8*, ...) @scanf(i8* getelementptr inbounds ([12 x i8], [12 x i8]* @.str, i64 0, i64 0), double* %8, double* %9, double* %10)
%13 = icmp eq i32 %12, 3
br i1 %13, label %14, label %89
14: ; preds = %11
%15 = load double, double* %9
%16 = fmul double 2.000000e+00, %15
%17 = load double, double* %9
%18 = load double, double* %10
%19 = fmul double 2.000000e+00, %18
%20 = load double, double* %10
%21 = fmul double %19, %20
%22 = call double @llvm.fmuladd.f64(double %16, double %17, double %21)
%23 = load double, double* %8
%24 = fneg double %23
%25 = load double, double* %8
%26 = call double @llvm.fmuladd.f64(double %24, double %25, double %22)
%27 = call double @sqrt(double %26)
%28 = fmul double 2.000000e+00, %27
%29 = fdiv double %28, 3.000000e+00
store double %29, double* %2
%30 = load double, double* %9
%31 = fneg double %30
%32 = load double, double* %9
%33 = load double, double* %10
%34 = fmul double 2.000000e+00, %33
%35 = load double, double* %10
%36 = fmul double %34, %35
%37 = call double @llvm.fmuladd.f64(double %31, double %32, double %36)
%38 = load double, double* %8
%39 = fmul double 2.000000e+00, %38
%40 = load double, double* %8
%41 = call double @llvm.fmuladd.f64(double %39, double %40, double %37)
%42 = call double @sqrt(double %41)
%43 = fmul double 2.000000e+00, %42
%44 = fdiv double %43, 3.000000e+00
store double %44, double* %3
%45 = load double, double* %9
%46 = fmul double 2.000000e+00, %45
%47 = load double, double* %9
%48 = load double, double* %10
%49 = fneg double %48
%50 = load double, double* %10
%51 = fmul double %49, %50
%52 = call double @llvm.fmuladd.f64(double %46, double %47, double %51)
%53 = load double, double* %8
%54 = fmul double 2.000000e+00, %53
%55 = load double, double* %8
%56 = call double @llvm.fmuladd.f64(double %54, double %55, double %52)
%57 = call double @sqrt(double %56)
%58 = fmul double 2.000000e+00, %57
%59 = fdiv double %58, 3.000000e+00
store double %59, double* %4
%60 = load double, double* %2
%61 = load double, double* %3
%62 = fadd double %60, %61
%63 = load double, double* %4
%64 = fadd double %62, %63
%65 = fdiv double %64, 2.000000e+00
store double %65, double* %5
%66 = load double, double* %5
%67 = load double, double* %5
%68 = load double, double* %2
%69 = fsub double %67, %68
%70 = fmul double %66, %69
%71 = load double, double* %5
%72 = load double, double* %3
%73 = fsub double %71, %72
%74 = fmul double %70, %73
%75 = load double, double* %5
%76 = load double, double* %4
%77 = fsub double %75, %76
%78 = fmul double %74, %77
store double %78, double* %7
%79 = load double, double* %7
%80 = fcmp ogt double %79, 0.000000e+00
br i1 %80, label %81, label %86
81: ; preds = %14
%82 = load double, double* %7
%83 = call double @sqrt(double %82)
store double %83, double* %6
%84 = load double, double* %6
%85 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.1, i64 0, i64 0), double %84)
br label %88
86: ; preds = %14
%87 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.2, i64 0, i64 0))
br label %88
88: ; preds = %86, %81
br label %11
89: ; preds = %11
ret i32 0
}

LLVM IR (-O2):
@.str = [12 x i8] c"%lf %lf %lf\00"
@.str.1 = [7 x i8] c"%.3lf\0A\00"
@str = [7 x i8] c"-1.000\00"
define i32 @main() {
%1 = alloca double
%2 = alloca double
%3 = alloca double
%4 = bitcast double* %1 to i8*
%5 = bitcast double* %2 to i8*
%6 = bitcast double* %3 to i8*
%7 = call i32 (i8*, ...) @scanf(i8* getelementptr inbounds ([12 x i8], [12 x i8]* @.str, i64 0, i64 0), double* %1, double* %2, double* %3)
%8 = icmp eq i32 %7, 3
br i1 %8, label %9, label %69
9: ; preds = %0, %66
%10 = load double, double* %2
%11 = fmul double %10, 2.000000e+00
%12 = load double, double* %3
%13 = fmul double %12, 2.000000e+00
%14 = fmul double %12, %13
%15 = call double @llvm.fmuladd.f64(double %11, double %10, double %14)
%16 = load double, double* %1
%17 = fneg double %16
%18 = call double @llvm.fmuladd.f64(double %17, double %16, double %15)
%19 = call double @sqrt(double %18)
%20 = fmul double %19, 2.000000e+00
%21 = fdiv double %20, 3.000000e+00
%22 = load double, double* %2
%23 = fneg double %22
%24 = load double, double* %3
%25 = fmul double %24, 2.000000e+00
%26 = fmul double %24, %25
%27 = call double @llvm.fmuladd.f64(double %23, double %22, double %26)
%28 = load double, double* %1
%29 = fmul double %28, 2.000000e+00
%30 = call double @llvm.fmuladd.f64(double %29, double %28, double %27)
%31 = call double @sqrt(double %30)
%32 = load double, double* %2
%33 = fmul double %32, 2.000000e+00
%34 = load double, double* %3
%35 = fneg double %34
%36 = fmul double %34, %35
%37 = call double @llvm.fmuladd.f64(double %33, double %32, double %36)
%38 = load double, double* %1
%39 = fmul double %38, 2.000000e+00
%40 = call double @llvm.fmuladd.f64(double %39, double %38, double %37)
%41 = call double @sqrt(double %40)
%42 = insertelement <2 x double> poison, double %41, i64 0
%43 = insertelement <2 x double> %42, double %31, i64 1
%44 = fmul <2 x double> %43, <double 2.000000e+00, double 2.000000e+00>
%45 = fdiv <2 x double> %44, <double 3.000000e+00, double 3.000000e+00>
%46 = extractelement <2 x double> %45, i64 1
%47 = fadd double %21, %46
%48 = extractelement <2 x double> %45, i64 0
%49 = fadd double %47, %48
%50 = fmul double %49, 5.000000e-01
%51 = fsub double %50, %21
%52 = fmul double %50, %51
%53 = insertelement <2 x double> poison, double %50, i64 0
%54 = shufflevector <2 x double> %53, <2 x double> poison, <2 x i32> zeroinitializer
%55 = fsub <2 x double> %54, %45
%56 = extractelement <2 x double> %55, i64 1
%57 = fmul double %56, %52
%58 = extractelement <2 x double> %55, i64 0
%59 = fmul double %58, %57
%60 = fcmp ogt double %59, 0.000000e+00
br i1 %60, label %61, label %64
61: ; preds = %9
%62 = call double @sqrt(double %59)
%63 = call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([7 x i8], [7 x i8]* @.str.1, i64 0, i64 0), double %62)
br label %66
64: ; preds = %9
%65 = call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([7 x i8], [7 x i8]* @str, i64 0, i64 0))
br label %66
66: ; preds = %64, %61
%67 = call i32 (i8*, ...) @scanf(i8* getelementptr inbounds ([12 x i8], [12 x i8]* @.str, i64 0, i64 0), double* %1, double* %2, double* %3)
%68 = icmp eq i32 %67, 3
br i1 %68, label %9, label %69
69: ; preds = %66, %0
ret i32 0
}