user: Translate the below assembly code into C programming language:

```asm
<longest_run_cdf>:
  endbr64
  push   %r15
  xor    %r15d,%r15d
  push   %r14
  xor    %r14d,%r14d
  push   %r13
  xor    %r13d,%r13d
  push   %r12
  xor    %r12d,%r12d
  push   %rbp
  xor    %ebp,%ebp
  push   %rbx
  sub    $0x18,%rsp
  mov    %edi,0xc(%rsp)
  mov    $0x400,%edi
  mov    %esi,(%rsp)
  call   <mpfr_set_default_prec@plt>
  mov    $0x400,%edi
  call   <mpfr_set_default_prec@plt>
  xor    %edi,%edi
  call   <mpfr_init@plt>
  xor    %edi,%edi
  call   <mpfr_init@plt>
  mov    %r12d,%edi
  call   <mpfr_init@plt>
  mov    %ebp,%edi
  call   <mpfr_init@plt>
  mov    %r15d,%edi
  call   <mpfr_init@plt>
  mov    %r14d,%edi
  call   <mpfr_init@plt>
  mov    %r13d,%edi
  call   <mpfr_init@plt>
  xor    %edi,%edi
  call   <mpfr_init@plt>
  xor    %edi,%edi
  call   <mpfr_init@plt>
  mov    D9(%rip),%rbx
  mov    0xc(%rsp),%esi
  xor    %edi,%edi
  mov    (%rbx),%edx
  call   <mpfr_init_set_ui@plt>
  mov    (%rbx),%edx
  mov    (%rsp),%esi
  xor    %edi,%edi
  call   <mpfr_init_set_ui@plt>
  mov    (%rbx),%ecx
  xor    %esi,%esi
  xor    %edi,%edi
  mov    $0x1,%edx
  call   <mpfr_add_ui@plt>
  mov    (%rbx),%ecx
  xor    %esi,%esi
  xor    %edi,%edi
  mov    $0x1,%edx
  call   <mpfr_add_ui@plt>
  mov    (%rbx),%edx
  mov    %r12d,%edi
  xor    %esi,%esi
  call   <mpfr_exp2@plt>
  mov    (%rbx),%ecx
  xor    %edx,%edx
  mov    %r12d,%esi
  mov    %r12d,%edi
  call   <mpfr_sub@plt>
  mov    (%rbx),%ecx
  mov    %r12d,%esi
  mov    %r12d,%edi
  mov    $0x2,%edx
  call   <mpfr_sub_ui@plt>
  mov    (%rbx),%ecx
  mov    %r12d,%edx
  xor    %esi,%esi
  mov    %ebp,%edi
  call   <mpfr_div@plt>
  mov    (%rbx),%edx
  mov    %ebp,%esi
  mov    %ebp,%edi
  call   <mpfr_neg@plt>
  mov    (%rbx),%edx
  mov    %ebp,%esi
  mov    %ebp,%edi
  call   <mpfr_exp@plt>
  mov    (%rbx),%edx
  xor    %esi,%esi
  mov    %r15d,%edi
  call   <mpfr_exp2@plt>
  mov    (%rbx),%ecx
  mov    %r15d,%esi
  mov    %r15d,%edi
  mov    $0x1,%edx
  call   <mpfr_sub_ui@plt>
  mov    (%rbx),%edx
  xor    %esi,%esi
  mov    %r14d,%edi
  call   <mpfr_exp2@plt>
  mov    (%rbx),%ecx
  xor    %esi,%esi
  mov    %r13d,%edi
  mov    $0x2,%edx
  call   <mpfr_add_ui@plt>
  mov    (%rbx),%ecx
  mov    %r13d,%esi
  mov    %r13d,%edi
  mov    $0x2,%edx
  call   <mpfr_div_ui@plt>
  mov    (%rbx),%ecx
  mov    %r13d,%edx
  mov    %r14d,%esi
  mov    %r14d,%edi
  call   <mpfr_sub@plt>
  mov    (%rbx),%ecx
  mov    %r14d,%edx
  mov    %r15d,%esi
  xor    %edi,%edi
  call   <mpfr_div@plt>
  mov    (%rbx),%ecx
  xor    %edx,%edx
  mov    %ebp,%esi
  xor    %edi,%edi
  call   <mpfr_mul@plt>
  mov    (%rbx),%esi
  xor    %edi,%edi
  call   <mpfr_get_d@plt>
  xor    %edi,%edi
  movsd  %xmm0,(%rsp)
  call   <mpfr_clear@plt>
  xor    %edi,%edi
  call   <mpfr_clear@plt>
  mov    %r12d,%edi
  call   <mpfr_clear@plt>
  mov    %ebp,%edi
  call   <mpfr_clear@plt>
  mov    %r15d,%edi
  call   <mpfr_clear@plt>
  mov    %r14d,%edi
  call   <mpfr_clear@plt>
  mov    %r13d,%edi
  call   <mpfr_clear@plt>
  xor    %edi,%edi
  call   <mpfr_clear@plt>
  xor    %edi,%edi
  call   <mpfr_clear@plt>
  xor    %edi,%edi
  call   <mpfr_clear@plt>
  xor    %edi,%edi
  call   <mpfr_clear@plt>
  movsd  (%rsp),%xmm0
  add    $0x18,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
```

assistant: ```c
double longest_run_cdf(unsigned int ui_n, unsigned int ui_r) {
  double answer;
  mpfr_set_default_prec(1024);
  mpfr_t n;
  mpfr_t r;
  mpfr_t topa;
  mpfr_t bottoma;
  mpfr_t first;
  mpfr_t topb;
  mpfr_t nplusone;
  mpfr_t bottomb;
  mpfr_t nplus2over2;
  mpfr_t second;
  mpfr_t mpfans;
  mpfr_set_default_prec(1024);
  mpfr_init(topa);
  mpfr_init(nplusone);
  mpfr_init(bottoma);
  mpfr_init(first);
  mpfr_init(topb);
  mpfr_init(bottomb);
  mpfr_init(nplus2over2);
  mpfr_init(second);
  mpfr_init(mpfans);
  mpfr_init_set_ui(n, ui_n, MPFR_RNDN);
  mpfr_init_set_ui(r, ui_r, MPFR_RNDN);
  mpfr_add_ui(topa, r, 1, MPFR_RNDN);
  mpfr_add_ui(nplusone, n, 1, MPFR_RNDN);
  mpfr_exp2(bottoma, nplusone, MPFR_RNDN);
  mpfr_sub(bottoma, bottoma, n, MPFR_RNDN);
  mpfr_sub_ui(bottoma, bottoma, 2, MPFR_RNDN);
  mpfr_div(first, topa, bottoma, MPFR_RNDN);
  mpfr_neg(first, first, MPFR_RNDN);
  mpfr_exp(first, first, MPFR_RNDN);
  mpfr_exp2(topb, nplusone, MPFR_RNDN);
  mpfr_sub_ui(topb, topb, 1, MPFR_RNDN);
  mpfr_exp2(bottomb, nplusone, MPFR_RNDN);
  mpfr_add_ui(nplus2over2, n, 2, MPFR_RNDN);
  mpfr_div_ui(nplus2over2, nplus2over2, 2, MPFR_RNDN);
  mpfr_sub(bottomb, bottomb, nplus2over2, MPFR_RNDN);
  mpfr_div(second, topb, bottomb, MPFR_RNDN);
  mpfr_mul(mpfans, first, second, MPFR_RNDN);
  answer = mpfr_get_d(mpfans, MPFR_RNDN);
  mpfr_clear(topa);
  mpfr_clear(nplusone);
  mpfr_clear(bottoma);
  mpfr_clear(first);
  mpfr_clear(topb);
  mpfr_clear(bottomb);
  mpfr_clear(nplus2over2);
  mpfr_clear(second);
  mpfr_clear(mpfans);
  mpfr_clear(n);
  mpfr_clear(r);
  return answer;
}
```