user: What is the c source code of the assembly code below:

```asm
<test_get_both_parts>:
  endbr64
  push   %r14
  mov    $0x4,%esi
  push   %r13
  lea    D3(%rip),%r13
  push   %r12
  xor    %r12d,%r12d
  push   %rbp
  push   %rbx
  xor    %ebx,%ebx
  sub    $0x90,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x88(%rsp)
  xor    %eax,%eax
  lea    0x18(%rsp),%rdx
  lea    0x20(%rsp),%rdi
  mov    D71(%rip),%rax
  lea    0x60(%rsp),%r14
  mov    %rax,0x20(%rsp)
  mov    D111(%rip),%rax
  mov    %rax,0x28(%rsp)
  mov    D120(%rip),%rax
  mov    %rax,0x30(%rsp)
  mov    D25(%rip),%rax
  mov    %rax,0x38(%rsp)
  mov    D26(%rip),%rax
  mov    %rax,0x48(%rsp)
  mov    D17(%rip),%rax
  mov    %rax,0x50(%rsp)
  mov    D126(%rip),%rax
  mov    %rax,0x58(%rsp)
  mov    D30(%rip),%rax
  mov    %rax,0x60(%rsp)
  mov    D35(%rip),%rax
  mov    %rax,0x68(%rsp)
  mov    D75(%rip),%rax
  mov    %rax,0x70(%rsp)
  mov    D119(%rip),%rax
  mov    %rax,0x78(%rsp)
  call   <get_both_parts@plt>
  movsd  D41(%rip),%xmm2
  mov    %rax,%rbp
L14:
  movsd  0x0(%rbp,%rbx,1),%xmm0
  movapd %xmm2,%xmm1
  mov    %r13,%rdi
  movsd  %xmm2,0x8(%rsp)
  call   <printf@plt>
  mov    0x18(%rsp),%rax
  movsd  (%r14,%rbx,1),%xmm1
  mov    %r13,%rdi
  movsd  (%rax,%rbx,1),%xmm0
  movsd  %xmm1,(%rsp)
  call   <printf@plt>
  movsd  0x8(%rsp),%xmm2
  xor    %edi,%edi
  ucomisd 0x0(%rbp,%rbx,1),%xmm2
  setnp  %dil
  cmovne %r12d,%edi
  call   <assert@plt>
  mov    0x18(%rsp),%rax
  movsd  (%rsp),%xmm1
  xor    %edi,%edi
  ucomisd (%rax,%rbx,1),%xmm1
  setnp  %dil
  cmovne %r12d,%edi
  add    $0x8,%rbx
  call   <assert@plt>
  cmp    $0x20,%rbx
  je     L17
  movsd  0x40(%rsp,%rbx,1),%xmm2
  jmp    L14
  nopw   0x0(%rax,%rax,1)
L17:
  mov    0x88(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L24
  add    $0x90,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  ret
L24:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: extract_symbolic_data
arguments: data_label: D3
data_type: string
name: extract_symbolic_data
arguments: data_label: D71
data_type: f64
name: extract_symbolic_data
arguments: data_label: D111
data_type: f64
name: extract_symbolic_data
arguments: data_label: D120
data_type: f64
name: extract_symbolic_data
arguments: data_label: D25
data_type: f64
name: extract_symbolic_data
arguments: data_label: D26
data_type: byte[8]
name: extract_symbolic_data
arguments: data_label: D17
data_type: byte[8]
name: extract_symbolic_data
arguments: data_label: D126
data_type: byte[8]
name: extract_symbolic_data
arguments: data_label: D30
data_type: f64
name: extract_symbolic_data
arguments: data_label: D35
data_type: f64
name: extract_symbolic_data
arguments: data_label: D75
data_type: f64
name: extract_symbolic_data
arguments: data_label: D119
data_type: f64
name: extract_symbolic_data
arguments: data_label: D41
data_type: byte[8]

tool: D3: %.18lf  %.18lf


tool: D71: 1.2

tool: D111: 2.718

tool: D120: 3.14159

tool: D25: 5.6

tool: {"D26": [0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40]}

tool: {"D17": [0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x40]}

tool: {"D126": [0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x40]}

tool: D30: 0.2

tool: D35: 0.718

tool: D75: 0.14159

tool: D119: 0.6

tool: {"D41": [0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x3f]}

assistant: ```c
void test_get_both_parts() {
  double array[] = {1.2, 2.718, 3.14159, 5.6};
  double expected_int[] = {1, 2, 3, 5};
  double expected_frac[] = {0.2, 0.718, 0.14159, 0.6};
  double *frac_part;
  int length = sizeof(array) / sizeof(double);
  double *int_part = get_both_parts(array, length, &frac_part);
  for (int i = 0; i < length; i++) {
    printf("%.18lf  %.18lf\n", int_part[i], expected_int[i]);
    printf("%.18lf  %.18lf\n", frac_part[i], expected_frac[i]);
    assert(int_part[i] == expected_int[i]);
    assert(frac_part[i] == expected_frac[i]);
  }
}
```