x86 32-bit machine code, 33 bytes
6A 03 59 D9 E8 D9 EE DC E1 DA 04 8C E2 FB D9 FD 6A 03 59 D9 C0 DA 2C 8C DE CA E2 F7 DE C9 D9 FA C3
Try it online!
Uses the cdecl calling convention, taking three 32-bit integers on the stack and returning a value on the FPU register stack.
In assembly:
f: push 3; pop ecx # Set ECX to 3. fld1 # Push 1 onto the FPU register stack. fldz # Push 0 onto the FPU register stack. fsubr st(1), st(0) # Change the 1 to 0-1=-1. l0: fiadd DWORD PTR [esp+4*ecx] # Add an argument to the top value. loop l0 # Loop 3 times, making the top value a+b+c. fscale # Multiply the top value by 2^(value below)=2^-1=1/2. push 3; pop ecx # Set ECX to 3 again. l1: fld st(0) # Duplicate the top value, which is s. fisubr DWORD PTR [esp+4*ecx]# Change the top value to a-s or b-s or c-s. fmulp st(2), st(0) # Multiply the third-from-top value # (which was -1) by that and pop it. loop l1 # Loop 3 times. # The FPU register stack is now -(a-s)(b-s)(c-s), s. fmulp st(1), st(0) # Multiply those values and pop, leaving the product. fsqrt # Take the square root. ret # Return.
I had another version using SIMD instructions to do multiple calculations at once, but it was longer, at 48 bytes:
5A 6A 00 89 E1 F8 C5 F8 5B 01 0F 59 C0 C5 FB 7C C8 C5 F3 7C C9 F3 0F 11 09 D9 01 F5 72 EC D8 C0 D9 C1 DE CA DE E9 D9 FA 58 6A 04 DA 31 58 FF E2
f: pop edx push 0 mov ecx, esp clc vcvtdq2ps xmm0, [ecx] r: mulps xmm0, xmm0 vhaddps xmm1, xmm0, xmm0 vhaddps xmm1, xmm1, xmm1 movss [ecx], xmm1 fld DWORD PTR [ecx] cmc jc r fadd st(0), st(0) fld st(1) fmulp st(2), st(0) fsubp fsqrt pop eax push 4 fidiv DWORD PTR [ecx] pop eax jmp edx