user: 请从给定的汇编指令推导出C源代码:

```asm
<PrintFP>:
  endbr64
  push   %r13
  pxor   %xmm5,%xmm5
  movapd %xmm0,%xmm1
  push   %r12
  push   %rbp
  push   %rbx
  mov    %rdi,%rbx
  sub    $0x18,%rsp
  comisd %xmm0,%xmm5
  ja     L81
L156:
  comisd D78(%rip),%xmm1
  jae    L150
  pxor   %xmm7,%xmm7
  mov    $0x1,%edx
  ucomisd %xmm7,%xmm1
  setp   %al
  cmovne %edx,%eax
  test   %al,%al
  je     L105
  movsd  D48(%rip),%xmm2
  comisd %xmm1,%xmm2
  jae    L63
L105:
  xor    %ebp,%ebp
L157:
  mov    D114(%rip),%rax
  mov    %ebp,%edi
  movsd  %xmm1,0x8(%rsp)
  movq   %rax,%xmm0
  call   <pow@plt>
  movsd  0x8(%rsp),%xmm1
  xor    %ecx,%ecx
  xor    %edx,%edx
  xor    %esi,%esi
  mov    %rbx,%r8
  divsd  %xmm0,%xmm1
  cvttsd2si %xmm1,%r12
  movsd  %xmm1,0x8(%rsp)
  mov    %r12d,%edi
  call   <PrintInt@plt>
  mov    %rbx,%rsi
  mov    $0x2e,%edi
  call   <PrintCh@plt>
  pxor   %xmm0,%xmm0
  movsd  0x8(%rsp),%xmm1
  pxor   %xmm6,%xmm6
  cvtsi2sd %r12,%xmm0
  subsd  %xmm0,%xmm1
  movsd  D114(%rip),%xmm0
  mulsd  %xmm1,%xmm0
  comisd %xmm0,%xmm6
  ja     L163
  movsd  D48(%rip),%xmm2
  comisd %xmm2,%xmm0
  jb     L26
  mov    $0x6,%r12d
  nopl   (%rax)
L89:
  pxor   %xmm3,%xmm3
  comisd %xmm0,%xmm3
  ja     L94
  mov    D48(%rip),%rax
  movq   %rax,%xmm2
  comisd %xmm2,%xmm0
  jb     L102
L120:
  addsd  %xmm0,%xmm2
  mov    %rbx,%rsi
  movsd  %xmm0,0x8(%rsp)
  cvttsd2si %xmm2,%r13
  lea    0x30(%r13),%edi
  movsbl %dil,%edi
  call   <PrintCh@plt>
  pxor   %xmm1,%xmm1
  movsd  0x8(%rsp),%xmm0
  cvtsi2sd %r13,%xmm1
  subsd  %xmm1,%xmm0
  mulsd  D114(%rip),%xmm0
  sub    $0x1,%r12d
  jne    L89
L102:
  test   %ebp,%ebp
  jne    L142
L121:
  add    $0x18,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  ret
  nopl   0x0(%rax,%rax,1)
L94:
  movsd  D77(%rip),%xmm4
  comisd %xmm0,%xmm4
  jb     L102
  mov    D48(%rip),%rax
  movq   %rax,%xmm2
  jmp    L120
  nopl   0x0(%rax)
L163:
  movsd  D77(%rip),%xmm1
  mov    $0x6,%r12d
  comisd %xmm0,%xmm1
  jae    L89
L26:
  mov    %rbx,%rsi
  mov    $0x30,%edi
  call   <PrintCh@plt>
  test   %ebp,%ebp
  je     L121
L142:
  mov    %rbx,%rsi
  mov    $0x65,%edi
  call   <PrintCh@plt>
  add    $0x18,%rsp
  mov    %rbx,%r8
  mov    %ebp,%edi
  pop    %rbx
  xor    %ecx,%ecx
  pop    %rbp
  xor    %edx,%edx
  pop    %r12
  xor    %esi,%esi
  pop    %r13
  jmp    10b0 <PrintInt@plt>
L150:
  movapd %xmm1,%xmm0
  movsd  %xmm1,0x8(%rsp)
  call   <log10@plt>
  movsd  0x8(%rsp),%xmm1
  cvttsd2si %xmm0,%ebp
  jmp    L157
  xchg   %ax,%ax
L81:
  mov    %rdi,%rsi
  mov    $0x2d,%edi
  movsd  %xmm0,0x8(%rsp)
  call   <PrintCh@plt>
  movsd  0x8(%rsp),%xmm1
  xorpd  D109(%rip),%xmm1
  jmp    L156
  cs nopw 0x0(%rax,%rax,1)
L63:
  movapd %xmm1,%xmm0
  movsd  %xmm1,0x8(%rsp)
  call   <log10@plt>
  subsd  D89(%rip),%xmm0
  movsd  0x8(%rsp),%xmm1
  cvttsd2si %xmm0,%ebp
  jmp    L157
```

tool_calls: name: unpack_data
arguments: data_label: D78
type_guessed: f64[2]
name: unpack_data
arguments: data_label: D48
type_guessed: byte[8]
name: unpack_data
arguments: data_label: D114
type_guessed: f64
name: unpack_data
arguments: data_label: D77
type_guessed: byte[8]
name: unpack_data
arguments: data_label: D109
type_guessed: f32[4]
name: unpack_data
arguments: data_label: D89
type_guessed: f64

tool: {"D78": [10000000.0,1e-7]}

tool: {"D48": [0x48,0xaf,0xbc,0x9a,0xf2,0xd7,0x7a,0x3e]}

tool: D114: 10

tool: {"D77": [0x48,0xaf,0xbc,0x9a,0xf2,0xd7,0x7a,0xbe]}

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

tool: D89: 0.999999999

assistant: ```c
void PrintFP(double Num, struct OutputStream *Stream) {
  int Exponent = 0;
  int MaxDecimal;
  if (Num < 0) {
    PrintCh('-', Stream);
    Num = -Num;
  }
  if (Num >= 1e7)
    Exponent = log10(Num);
  else if (Num <= 1e-7 && Num != 0.0)
    Exponent = log10(Num) - 0.999999999;
  Num /= pow(10.0, Exponent);
  PrintInt((long)Num, 0, 0, 0, Stream);
  PrintCh('.', Stream);
  Num = (Num - (long)Num) * 10;
  if ((((Num) < 0) ? (-(Num)) : (Num)) >= 1e-7) {
    for (MaxDecimal = 6; MaxDecimal > 0 && (((Num) < 0) ? (-(Num)) : (Num)) >= 1e-7; Num = (Num - (long)(Num + 1e-7)) * 10, MaxDecimal--)
      PrintCh('0' + (long)(Num + 1e-7), Stream);
  } else
    PrintCh('0', Stream);
  if (Exponent != 0) {
    PrintCh('e', Stream);
    PrintInt(Exponent, 0, 0, 0, Stream);
  }
}
```