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

```asm
<ortho_para_ratio>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0xa0,%rsp
  movsd  %xmm0,-0x98(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  pxor   %xmm0,%xmm0
  movsd  %xmm0,-0x80(%rbp)
  pxor   %xmm0,%xmm0
  movsd  %xmm0,-0x78(%rbp)
  pxor   %xmm0,%xmm0
  movsd  %xmm0,-0x40(%rbp)
  movsd  D4(%rip),%xmm0
  movsd  %xmm0,-0x38(%rbp)
  movsd  D41(%rip),%xmm0
  movsd  %xmm0,-0x30(%rbp)
  movsd  D45(%rip),%xmm0
  movsd  %xmm0,-0x28(%rbp)
  movsd  D51(%rip),%xmm0
  movsd  %xmm0,-0x20(%rbp)
  movsd  D32(%rip),%xmm0
  movsd  %xmm0,-0x18(%rbp)
  movl   $0x0,-0x84(%rbp)
  jmp    L35
L8:
  pxor   %xmm0,%xmm0
  cvtsi2sdl -0x84(%rbp),%xmm0
  movapd %xmm0,%xmm1
  addsd  %xmm0,%xmm1
  movsd  D62(%rip),%xmm0
  addsd  %xmm1,%xmm0
  mov    -0x84(%rbp),%eax
  cltq
  movsd  %xmm0,-0x70(%rbp,%rax,8)
  addl   $0x1,-0x84(%rbp)
L35:
  cmpl   $0x5,-0x84(%rbp)
  jle    L8
  movl   $0x0,-0x84(%rbp)
  jmp    L48
L2:
  mov    -0x84(%rbp),%eax
  cltq
  movsd  -0x70(%rbp,%rax,8),%xmm2
  movsd  %xmm2,-0xa0(%rbp)
  mov    -0x84(%rbp),%eax
  cltq
  movsd  -0x40(%rbp,%rax,8),%xmm0
  movq   D16(%rip),%xmm1
  xorpd  %xmm1,%xmm0
  divsd  -0x98(%rbp),%xmm0
  movq   %xmm0,%rax
  movq   %rax,%xmm0
  call   <exp@plt>
  mulsd  -0xa0(%rbp),%xmm0
  movsd  -0x78(%rbp),%xmm1
  addsd  %xmm1,%xmm0
  movsd  %xmm0,-0x78(%rbp)
  addl   $0x2,-0x84(%rbp)
L48:
  cmpl   $0x4,-0x84(%rbp)
  jle    L2
  movl   $0x1,-0x84(%rbp)
  jmp    L41
L13:
  mov    -0x84(%rbp),%eax
  cltq
  movsd  -0x70(%rbp,%rax,8),%xmm3
  movsd  %xmm3,-0xa0(%rbp)
  mov    -0x84(%rbp),%eax
  cltq
  movsd  -0x40(%rbp,%rax,8),%xmm0
  movq   D16(%rip),%xmm1
  xorpd  %xmm1,%xmm0
  divsd  -0x98(%rbp),%xmm0
  movq   %xmm0,%rax
  movq   %rax,%xmm0
  call   <exp@plt>
  mulsd  -0xa0(%rbp),%xmm0
  movsd  -0x80(%rbp),%xmm1
  addsd  %xmm1,%xmm0
  movsd  %xmm0,-0x80(%rbp)
  addl   $0x2,-0x84(%rbp)
L41:
  cmpl   $0x5,-0x84(%rbp)
  jle    L13
  movsd  -0x80(%rbp),%xmm1
  movsd  D34(%rip),%xmm0
  mulsd  %xmm1,%xmm0
  movapd %xmm0,%xmm1
  addsd  -0x78(%rbp),%xmm1
  movsd  -0x78(%rbp),%xmm0
  divsd  %xmm1,%xmm0
  movq   %xmm0,%rax
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L66
  call   <__stack_chk_fail@plt>
L66:
  movq   %rax,%xmm0
  leave
  ret
```

tool_calls: name: parse_data
arguments: data_tag: D4
type_guessed: f64
name: parse_data
arguments: data_tag: D41
type_guessed: f64
name: parse_data
arguments: data_tag: D45
type_guessed: f64
name: parse_data
arguments: data_tag: D51
type_guessed: f64
name: parse_data
arguments: data_tag: D32
type_guessed: f64
name: parse_data
arguments: data_tag: D62
type_guessed: f64
name: parse_data
arguments: data_tag: D16
type_guessed: f32[2]
name: parse_data
arguments: data_tag: D34
type_guessed: f64

tool: D4: 170.5

tool: D41: 509.9

tool: D45: 1015.1

tool: D51: 1681.7

tool: D32: 2504

tool: D62: 1

tool: {"D16": [0.0,-0.0]}

tool: D34: 3

assistant: ```c
double ortho_para_ratio(double T) {
  double weights[6], sum_ortho = 0.0, sum_para = 0.0;
  int i;
  const double energy[6] = {0e0, 170.5, 509.9, 1015.1, 1681.7, 2504e0};
  for (i = 0; i <= 5; i++)
    weights[i] = 2e0 * (double)i + 1e0;
  for (i = 0; i <= 4; i += 2)
    sum_para += weights[i] * exp(-energy[i] / T);
  for (i = 1; i <= 5; i += 2)
    sum_ortho += weights[i] * exp(-energy[i] / T);
  return sum_para / (3e0 * sum_ortho + sum_para);
}
```