void Powered_Error(float error, float *correction, float max, float max_c) {
  float step = 1, value;
  step = step / max;
  if (error != 0) {
    step = error * step;
    value = step * step;
    *correction = max_c * value;
    if (error < 0)
      *correction = *correction * -1;
  } else
    *correction = 0;
}


x86 assembly (clang, -O0):
<Powered_Error>:
push   %rbp
mov    %rsp,%rbp
movss  %xmm0,-0x4(%rbp)
mov    %rdi,-0x10(%rbp)
movss  %xmm1,-0x14(%rbp)
movss  %xmm2,-0x18(%rbp)
movss  0xee1(%rip),%xmm0
movss  %xmm0,-0x1c(%rbp)
movss  -0x1c(%rbp),%xmm0
divss  -0x14(%rbp),%xmm0
movss  %xmm0,-0x1c(%rbp)
movss  -0x4(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomiss %xmm1,%xmm0
jne    114f <Powered_Error+0x4f>
jp     114f <Powered_Error+0x4f>
jmp    11a9 <Powered_Error+0xa9>
movss  -0x4(%rbp),%xmm0
mulss  -0x1c(%rbp),%xmm0
movss  %xmm0,-0x1c(%rbp)
movss  -0x1c(%rbp),%xmm0
mulss  -0x1c(%rbp),%xmm0
movss  %xmm0,-0x20(%rbp)
movss  -0x18(%rbp),%xmm0
mulss  -0x20(%rbp),%xmm0
mov    -0x10(%rbp),%rax
movss  %xmm0,(%rax)
xorps  %xmm0,%xmm0
ucomiss -0x4(%rbp),%xmm0
jbe    11a4 <Powered_Error+0xa4>
mov    -0x10(%rbp),%rax
movss  0xe6c(%rip),%xmm0
mulss  (%rax),%xmm0
mov    -0x10(%rbp),%rax
movss  %xmm0,(%rax)
jmp    11b4 <Powered_Error+0xb4>
mov    -0x10(%rbp),%rax
xorps  %xmm0,%xmm0
movss  %xmm0,(%rax)
pop    %rbp
ret

x86 assembly (clang, -O2):
<Powered_Error>:
xorps  %xmm3,%xmm3
ucomiss %xmm3,%xmm0
jne    110a <Powered_Error+0xa>
jnp    1135 <Powered_Error+0x35>
movss  0xeee(%rip),%xmm3
divss  %xmm1,%xmm3
mulss  %xmm0,%xmm3
mulss  %xmm3,%xmm3
mulss  %xmm2,%xmm3
movss  %xmm3,(%rdi)
xorps  %xmm1,%xmm1
ucomiss %xmm0,%xmm1
jbe    1139 <Powered_Error+0x39>
xorps  0xedb(%rip),%xmm3
movss  %xmm3,(%rdi)
ret

LLVM IR (-O0):
define void @Powered_Error(float %0, float* %1, float %2, float %3) {
%5 = alloca float
%6 = alloca float*
%7 = alloca float
%8 = alloca float
%9 = alloca float
%10 = alloca float
store float %0, float* %5
store float* %1, float** %6
store float %2, float* %7
store float %3, float* %8
store float 1.000000e+00, float* %9
%11 = load float, float* %9
%12 = load float, float* %7
%13 = fdiv float %11, %12
store float %13, float* %9
%14 = load float, float* %5
%15 = fcmp une float %14, 0.000000e+00
br i1 %15, label %16, label %35
16: ; preds = %4
%17 = load float, float* %5
%18 = load float, float* %9
%19 = fmul float %17, %18
store float %19, float* %9
%20 = load float, float* %9
%21 = load float, float* %9
%22 = fmul float %20, %21
store float %22, float* %10
%23 = load float, float* %8
%24 = load float, float* %10
%25 = fmul float %23, %24
%26 = load float*, float** %6
store float %25, float* %26
%27 = load float, float* %5
%28 = fcmp olt float %27, 0.000000e+00
br i1 %28, label %29, label %34
29: ; preds = %16
%30 = load float*, float** %6
%31 = load float, float* %30
%32 = fmul float %31, -1.000000e+00
%33 = load float*, float** %6
store float %32, float* %33
br label %34
34: ; preds = %29, %16
br label %37
35: ; preds = %4
%36 = load float*, float** %6
store float 0.000000e+00, float* %36
br label %37
37: ; preds = %35, %34
ret void
}

LLVM IR (-O2):
define void @Powered_Error(float %0, float* nocapture writeonly %1, float %2, float %3) {
%5 = fcmp une float %0, 0.000000e+00
br i1 %5, label %6, label %14
6: ; preds = %4
%7 = fdiv float 1.000000e+00, %2
%8 = fmul float %7, %0
%9 = fmul float %8, %8
%10 = fmul float %9, %3
store float %10, float* %1
%11 = fcmp olt float %0, 0.000000e+00
br i1 %11, label %12, label %16
12: ; preds = %6
%13 = fneg float %10
br label %14
14: ; preds = %4, %12
%15 = phi float [ %13, %12 ], [ 0.000000e+00, %4 ]
store float %15, float* %1
br label %16
16: ; preds = %14, %6
ret void
}