user: 请将以下的汇编代码转换成C语言代码：

```asm
<BGBDT_TagParse_ParseFloat>:
  endbr64
  push   %rbx
  mov    $0x1,%ebx
  sub    $0x10,%rsp
  movzbl (%rdi),%edx
  cmp    $0x2d,%dl
  jne    L100
  movzbl 0x1(%rdi),%edx
  mov    $0xffffffff,%ebx
  add    $0x1,%rdi
L100:
  test   %dl,%dl
  je     L32
  pxor   %xmm2,%xmm2
  movsd  D12(%rip),%xmm3
  movapd %xmm2,%xmm1
  nopl   0x0(%rax,%rax,1)
L138:
  add    $0x1,%rdi
  movsbl %dl,%eax
  cmp    $0x5f,%dl
  je     L108
  cmp    $0x2e,%eax
  je     L170
  sub    $0x30,%eax
  movapd %xmm2,%xmm0
  cmp    $0x9,%eax
  ja     L53
  pxor   %xmm0,%xmm0
  cvtsi2sd %eax,%xmm0
L53:
  mulsd  %xmm3,%xmm1
  addsd  %xmm0,%xmm1
L108:
  movzbl (%rdi),%edx
  test   %dl,%dl
  jne    L138
L52:
  pxor   %xmm0,%xmm0
  add    $0x10,%rsp
  cvtsi2sd %ebx,%xmm0
  pop    %rbx
  mulsd  %xmm1,%xmm0
  ret
  cs nopw 0x0(%rax,%rax,1)
L170:
  movsd  D28(%rip),%xmm3
  movzbl (%rdi),%edx
  movapd %xmm3,%xmm2
  test   %dl,%dl
  je     L52
  nopl   0x0(%rax,%rax,1)
L120:
  mov    %rdi,%rcx
  movsbl %dl,%eax
  add    $0x1,%rdi
  cmp    $0x5f,%dl
  je     L141
  sub    $0x30,%eax
  cmp    $0x9,%eax
  ja     L59
  pxor   %xmm0,%xmm0
  cvtsi2sd %eax,%xmm0
  mulsd  %xmm2,%xmm0
  mulsd  %xmm3,%xmm2
  addsd  %xmm0,%xmm1
L141:
  movzbl (%rdi),%edx
  test   %dl,%dl
  jne    L120
  pxor   %xmm0,%xmm0
  add    $0x10,%rsp
  cvtsi2sd %ebx,%xmm0
  pop    %rbx
  mulsd  %xmm1,%xmm0
  ret
  nopl   0x0(%rax)
L59:
  movzbl (%rdi),%eax
  and    $0xffffffdf,%eax
  cmp    $0x45,%al
  jne    L52
  cmpb   $0x2b,0x1(%rdi)
  lea    0x2(%rdi),%r8
  je     L107
  lea    0x2(%rcx),%r8
L107:
  mov    %r8,%rdi
  movsd  %xmm1,0x8(%rsp)
  call   <BGBDT_TagParse_ParseInt@plt>
  mov    D28(%rip),%rsi
  movsd  0x8(%rsp),%xmm1
  test   %eax,%eax
  movq   %rsi,%xmm3
  jle    L61
  movsd  D12(%rip),%xmm0
  sub    $0x1,%eax
  nopl   0x0(%rax,%rax,1)
L146:
  mulsd  %xmm0,%xmm1
  sub    $0x1,%eax
  jae    L146
  jmp    L52
L61:
  je     L52
  not    %eax
  cs nopw 0x0(%rax,%rax,1)
L166:
  mulsd  %xmm3,%xmm1
  sub    $0x1,%eax
  jae    L166
  jmp    L52
L32:
  pxor   %xmm1,%xmm1
  jmp    L52
```

tool_calls: name: unpack_data
arguments: tag: D12
type_infered: byte[8]
name: unpack_data
arguments: tag: D28
type_infered: f64

tool: {"D12": [0x00,0x00,0x00,0x00,0x00,0x00,0x24,0x40]}

tool: D28: 0.1

assistant: ```c
double BGBDT_TagParse_ParseFloat(char *s) {
  double v, sc;
  int sg, se;
  int i, j, k;
  if (*s == '-') {
    s++;
    sg = -1;
  } else {
    sg = 1;
  }
  v = 0;
  while (*s) {
    i = *s++;
    j = 0;
    if (i == '_')
      continue;
    if (i == '.') {
      s--;
      break;
    }
    if ((i >= '0') && (i <= '9')) {
      j = i - '0';
    }
    v = (v * 10) + j;
  }
  if (*s == '.') {
    s++;
    sc = 0.1;
    while (*s) {
      i = *s++;
      j = 0;
      if (i == '_')
        continue;
      if ((i >= '0') && (i <= '9')) {
        j = i - '0';
      } else {
        break;
      }
      v = v + (j * sc);
      sc = sc * 0.1;
    }
    if ((*s == 'e') || (*s == 'E')) {
      s++;
      if (*s == '+')
        s++;
      se = BGBDT_TagParse_ParseInt(s);
      if (se > 0) {
        i = se;
        while (i--)
          v = v * 10;
      } else if (se < 0) {
        i = -se;
        while (i--)
          v = v * 0.1;
      }
    }
  }
  return (v * sg);
}
```