user: Converte this assembly snippet into its equivalent C code:

```asm
<atan>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  movsd  %xmm0,-0x28(%rbp)
  pxor   %xmm0,%xmm0
  comisd -0x28(%rbp),%xmm0
  jbe    L21
  movsd  -0x28(%rbp),%xmm0
  movq   D0(%rip),%xmm1
  xorpd  %xmm1,%xmm0
  jmp    L29
L21:
  movsd  -0x28(%rbp),%xmm0
L29:
  movsd  %xmm0,-0x20(%rbp)
  movsd  -0x20(%rbp),%xmm0
  movsd  D37(%rip),%xmm1
  subsd  %xmm1,%xmm0
  movsd  -0x20(%rbp),%xmm2
  movsd  D37(%rip),%xmm1
  addsd  %xmm2,%xmm1
  divsd  %xmm1,%xmm0
  movsd  %xmm0,-0x18(%rbp)
  movsd  -0x18(%rbp),%xmm0
  mulsd  %xmm0,%xmm0
  movsd  %xmm0,-0x10(%rbp)
  movsd  -0x10(%rbp),%xmm1
  movsd  D26(%rip),%xmm0
  mulsd  %xmm0,%xmm1
  movsd  D45(%rip),%xmm0
  addsd  %xmm1,%xmm0
  mulsd  -0x10(%rbp),%xmm0
  movsd  D18(%rip),%xmm1
  subsd  %xmm1,%xmm0
  movapd %xmm0,%xmm1
  mulsd  -0x10(%rbp),%xmm1
  movsd  D69(%rip),%xmm0
  addsd  %xmm1,%xmm0
  mulsd  -0x10(%rbp),%xmm0
  movsd  D110(%rip),%xmm1
  subsd  %xmm1,%xmm0
  movapd %xmm0,%xmm1
  mulsd  -0x10(%rbp),%xmm1
  movsd  D52(%rip),%xmm0
  addsd  %xmm1,%xmm0
  mulsd  -0x10(%rbp),%xmm0
  movsd  D68(%rip),%xmm1
  subsd  %xmm1,%xmm0
  movapd %xmm0,%xmm1
  mulsd  -0x10(%rbp),%xmm1
  movsd  D46(%rip),%xmm0
  addsd  %xmm1,%xmm0
  movapd %xmm0,%xmm1
  mulsd  -0x18(%rbp),%xmm1
  movsd  D82(%rip),%xmm0
  addsd  %xmm1,%xmm0
  movsd  %xmm0,-0x8(%rbp)
  pxor   %xmm0,%xmm0
  comisd -0x28(%rbp),%xmm0
  jbe    L19
  movsd  -0x8(%rbp),%xmm0
  movq   D0(%rip),%xmm1
  xorpd  %xmm1,%xmm0
  jmp    L32
L19:
  movsd  -0x8(%rbp),%xmm0
L32:
  movq   %xmm0,%rax
  movq   %rax,%xmm0
  pop    %rbp
  ret
```

tool_calls: name: extract_symbolic_data
arguments: data_tag: D0
datatype: f32[2]
name: extract_symbolic_data
arguments: data_tag: D37
datatype: f64
name: extract_symbolic_data
arguments: data_tag: D26
datatype: byte[8]
name: extract_symbolic_data
arguments: data_tag: D45
datatype: byte[8]
name: extract_symbolic_data
arguments: data_tag: D18
datatype: byte[8]
name: extract_symbolic_data
arguments: data_tag: D69
datatype: byte[8]
name: extract_symbolic_data
arguments: data_tag: D110
datatype: byte[8]
name: extract_symbolic_data
arguments: data_tag: D52
datatype: byte[8]
name: extract_symbolic_data
arguments: data_tag: D68
datatype: byte[8]
name: extract_symbolic_data
arguments: data_tag: D46
datatype: byte[8]
name: extract_symbolic_data
arguments: data_tag: D82
datatype: f64

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

tool: D37: 1

tool: {"D26": [0x61,0xda,0x6a,0xe8,0xfc,0x9a,0x70,0xbf]}

tool: {"D45": [0x4f,0xad,0x8c,0x37,0xca,0x62,0x96,0x3f]}

tool: {"D18": [0xdc,0x29,0xa5,0x78,0x38,0xa0,0xac,0x3f]}

tool: {"D69": [0xed,0x9f,0x16,0xe8,0xfb,0xae,0xb8,0x3f]}

tool: {"D110": [0x25,0xc9,0xcd,0x5a,0x8c,0xcd,0xc1,0x3f]}

tool: {"D52": [0x8f,0x49,0xba,0xb6,0x14,0x88,0xc9,0x3f]}

tool: {"D68": [0x2b,0xb0,0x49,0x7c,0xc3,0x54,0xd5,0x3f]}

tool: {"D46": [0x61,0x79,0xda,0x99,0xfe,0xff,0xef,0x3f]}

tool: D82: 0.785398163397

assistant: ```c
double atan(x)
double x;
{
  double xi, q, q2, y;
  int sign;
  xi = (x < 0. ? -x : x);
  q = (xi - 1.0) / (xi + 1.0);
  q2 = q * q;
  y = (((((((-.0040540580 * q2 + .0218612286) * q2 - .0559098861) * q2 + .0964200441) * q2 - .1390853351) * q2 + .1994653599) * q2 - .3332985605) * q2 + .9999993329) * q + 0.785398163397;
  return (x < 0. ? -y : y);
}
```