// File: /workspace/github_cpp_makefile_star2_O2/halfflat[P]tinyopt/test/googletest/googletest/src/gtest.cc
// Function: testing::internal::DoubleNearPredFormat(char const*, char const*, char const*, double, double, double)
AssertionResult DoubleNearPredFormat(const char* expr1, const char* expr2,
                                     const char* abs_error_expr, double val1,
                                     double val2, double abs_error) {
  const double diff = fabs(val1 - val2);
  if (diff <= abs_error) return AssertionSuccess();

  // Find the value which is closest to zero.
  const double min_abs = std::min(fabs(val1), fabs(val2));
  // Find the distance to the next double from that value.
  const double epsilon =
      nextafter(min_abs, std::numeric_limits<double>::infinity()) - min_abs;
  // Detect the case where abs_error is so small that EXPECT_NEAR is
  // effectively the same as EXPECT_EQUAL, and give an informative error
  // message so that the situation can be more easily understood without
  // requiring exotic floating-point knowledge.
  // Don't do an epsilon check if abs_error is zero because that implies
  // that an equality check was actually intended.
  if (!(std::isnan)(val1) && !(std::isnan)(val2) && abs_error > 0 &&
      abs_error < epsilon) {
    return AssertionFailure()
           << "The difference between " << expr1 << " and " << expr2 << " is "
           << diff << ", where\n"
           << expr1 << " evaluates to " << val1 << ",\n"
           << expr2 << " evaluates to " << val2 << ".\nThe abs_error parameter "
           << abs_error_expr << " evaluates to " << abs_error
           << " which is smaller than the minimum distance between doubles for "
              "numbers of this magnitude which is "
           << epsilon
           << ", thus making this EXPECT_NEAR check equivalent to "
              "EXPECT_EQUAL. Consider using EXPECT_DOUBLE_EQ instead.";
  }
  return AssertionFailure()
         << "The difference between " << expr1 << " and " << expr2 << " is "
         << diff << ", which exceeds " << abs_error_expr << ", where\n"
         << expr1 << " evaluates to " << val1 << ",\n"
         << expr2 << " evaluates to " << val2 << ", and\n"
         << abs_error_expr << " evaluates to " << abs_error << ".";
}

// Assembly:
pushq %r14
pushq %rbx
subq $0x98, %rsp
movapd %xmm0, %xmm3
movq %rdi, %rbx
movq %rsi, 0x10(%rsp)
movq %rdx, 0x8(%rsp)
movq %rcx, 0x18(%rsp)
movsd %xmm0, 0x38(%rsp)
movsd %xmm1, 0x30(%rsp)
subsd %xmm1, %xmm0
andpd 0x1c841(%rip), %xmm0    # 0x5ae60
movsd %xmm2, 0x28(%rsp)
movlpd %xmm0, 0x20(%rsp)
ucomisd %xmm0, %xmm2
jae 0x3e809
movapd 0x1c823(%rip), %xmm0    # 0x5ae60
movapd %xmm3, %xmm4
andpd %xmm0, %xmm4
movapd %xmm1, 0x60(%rsp)
andpd %xmm1, %xmm0
minsd %xmm4, %xmm0
movapd %xmm0, 0x70(%rsp)
movsd 0x1c8bf(%rip), %xmm1    # 0x5af20
movsd %xmm2, 0x40(%rsp)
movapd %xmm3, 0x80(%rsp)
callq 0xd3f0
movsd 0x40(%rsp), %xmm2
subsd 0x70(%rsp), %xmm0
movsd %xmm0, 0x58(%rsp)
movapd 0x80(%rsp), %xmm1
ucomisd %xmm1, %xmm1
jp 0x3e816
movapd 0x60(%rsp), %xmm1
ucomisd %xmm1, %xmm1
jp 0x3e816
xorpd %xmm1, %xmm1
ucomisd %xmm1, %xmm2
jbe 0x3e816
ucomisd %xmm2, %xmm0
jbe 0x3e816
leaq 0x50(%rsp), %r14
movb $0x0, -0x8(%r14)
andq $0x0, (%r14)
leaq 0x1d490(%rip), %rsi     # 0x5bb67
leaq 0x48(%rsp), %rdi
callq 0x4ce3e
leaq 0x10(%rsp), %rsi
movq %rax, %rdi
callq 0x4ceae
leaq 0x1d48a(%rip), %rsi     # 0x5bb7f
movq %rax, %rdi
callq 0x4cf18
leaq 0x8(%rsp), %rsi
movq %rax, %rdi
callq 0x4ceae
leaq 0x1d506(%rip), %rsi     # 0x5bc17
movq %rax, %rdi
callq 0x4cf88
leaq 0x20(%rsp), %rsi
movq %rax, %rdi
callq 0x4cff8
leaq 0x1d458(%rip), %rsi     # 0x5bb85
movq %rax, %rdi
callq 0x4d062
leaq 0x10(%rsp), %rsi
movq %rax, %rdi
callq 0x4ceae
leaq 0x1d445(%rip), %rsi     # 0x5bb8e
movq %rax, %rdi
callq 0x4d0d2
leaq 0x38(%rsp), %rsi
movq %rax, %rdi
callq 0x4cff8
leaq 0x1df4e(%rip), %rsi     # 0x5c6b3
movq %rax, %rdi
callq 0x4d142
leaq 0x8(%rsp), %rsi
movq %rax, %rdi
callq 0x4ceae
leaq 0x1d40d(%rip), %rsi     # 0x5bb8e
movq %rax, %rdi
callq 0x4d0d2
leaq 0x30(%rsp), %rsi
movq %rax, %rdi
callq 0x4cff8
leaq 0x1d400(%rip), %rsi     # 0x5bb9d
movq %rax, %rdi
callq 0x4d1b2
leaq 0x18(%rsp), %rsi
movq %rax, %rdi
callq 0x4ceae
leaq 0x1d3d5(%rip), %rsi     # 0x5bb8e
movq %rax, %rdi
callq 0x4d0d2
leaq 0x28(%rsp), %rsi
movq %rax, %rdi
callq 0x4cff8
leaq 0x1d3e3(%rip), %rsi     # 0x5bbb8
movq %rax, %rdi
callq 0x4d222
leaq 0x58(%rsp), %rsi
movq %rax, %rdi
callq 0x4cff8
leaq 0x1d42b(%rip), %rsi     # 0x5bc1c
movq %rax, %rdi
callq 0x4d292
movq %rbx, %rdi
movq %rax, %rsi
callq 0x357d0
jmp 0x3e958
movb $0x1, (%rbx)
andq $0x0, 0x8(%rbx)
jmp 0x3e960
leaq 0x50(%rsp), %r14
movb $0x0, -0x8(%r14)
andq $0x0, (%r14)
leaq 0x1d33c(%rip), %rsi     # 0x5bb67
leaq 0x48(%rsp), %rdi
callq 0x4ce3e
leaq 0x10(%rsp), %rsi
movq %rax, %rdi
callq 0x4ceae
leaq 0x1d336(%rip), %rsi     # 0x5bb7f
movq %rax, %rdi
callq 0x4cf18
leaq 0x8(%rsp), %rsi
movq %rax, %rdi
callq 0x4ceae
leaq 0x1d3b2(%rip), %rsi     # 0x5bc17
movq %rax, %rdi
callq 0x4cf88
leaq 0x20(%rsp), %rsi
movq %rax, %rdi
callq 0x4cff8
leaq 0x1d405(%rip), %rsi     # 0x5bc86
movq %rax, %rdi
callq 0x4d302
leaq 0x18(%rsp), %rsi
movq %rax, %rdi
callq 0x4ceae
leaq 0x1d2e8(%rip), %rsi     # 0x5bb85
movq %rax, %rdi
callq 0x4d062
leaq 0x10(%rsp), %rsi
movq %rax, %rdi
callq 0x4ceae
leaq 0x1d2d5(%rip), %rsi     # 0x5bb8e
movq %rax, %rdi
callq 0x4d0d2
leaq 0x38(%rsp), %rsi
movq %rax, %rdi
callq 0x4cff8
leaq 0x1ddde(%rip), %rsi     # 0x5c6b3
movq %rax, %rdi
callq 0x4d142
leaq 0x8(%rsp), %rsi
movq %rax, %rdi
callq 0x4ceae
leaq 0x1d29d(%rip), %rsi     # 0x5bb8e
movq %rax, %rdi
callq 0x4d0d2
leaq 0x30(%rsp), %rsi
movq %rax, %rdi
callq 0x4cff8
leaq 0x1d38a(%rip), %rsi     # 0x5bc97
movq %rax, %rdi
callq 0x4d372
leaq 0x18(%rsp), %rsi
movq %rax, %rdi
callq 0x4ceae
leaq 0x1d265(%rip), %rsi     # 0x5bb8e
movq %rax, %rdi
callq 0x4d0d2
leaq 0x28(%rsp), %rsi
movq %rax, %rdi
callq 0x4cff8
leaq 0x18ea7(%rip), %rsi     # 0x577ec
movq %rax, %rdi
callq 0x4d3e2
movq %rbx, %rdi
movq %rax, %rsi
callq 0x357d0
movq %r14, %rdi
callq 0x13646
movq %rbx, %rax
addq $0x98, %rsp
popq %rbx
popq %r14
retq
jmp 0x3e970
movq %rax, %rbx
movq %r14, %rdi
callq 0x13646
movq %rbx, %rdi
callq 0xdaa0