char fl_eq(double a, double b) {
  return ((a == 0 && b == 0) || (!(a == 0 || b == 0) && (a / b > 0) &&
                                 ((a / b < 1.0001) && (b / a < 1.0001))));
}


x86 assembly (clang, -O0):
<fl_eq>:
push   %rbp
mov    %rsp,%rbp
movsd  %xmm0,-0x8(%rbp)
movsd  %xmm1,-0x10(%rbp)
movsd  -0x8(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    1148 <fl_eq+0x48>
jp     1148 <fl_eq+0x48>
movsd  -0x10(%rbp),%xmm0
mov    $0x1,%al
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
mov    %al,-0x11(%rbp)
jne    1148 <fl_eq+0x48>
jp     1148 <fl_eq+0x48>
jmp    11f1 <fl_eq+0xf1>
movsd  -0x8(%rbp),%xmm0
xor    %eax,%eax
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
mov    %al,-0x12(%rbp)
jne    116a <fl_eq+0x6a>
jp     116a <fl_eq+0x6a>
jmp    11eb <fl_eq+0xeb>
movsd  -0x10(%rbp),%xmm0
xor    %eax,%eax
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
mov    %al,-0x12(%rbp)
jne    118c <fl_eq+0x8c>
jp     118c <fl_eq+0x8c>
jmp    11eb <fl_eq+0xeb>
movsd  -0x8(%rbp),%xmm0
divsd  -0x10(%rbp),%xmm0
xor    %eax,%eax
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
mov    %al,-0x12(%rbp)
jbe    11eb <fl_eq+0xeb>
movsd  -0x8(%rbp),%xmm1
divsd  -0x10(%rbp),%xmm1
xor    %eax,%eax
movsd  0xe44(%rip),%xmm0
ucomisd %xmm1,%xmm0
mov    %al,-0x13(%rbp)
jbe    11e5 <fl_eq+0xe5>
movsd  -0x10(%rbp),%xmm1
divsd  -0x8(%rbp),%xmm1
movsd  0xe25(%rip),%xmm0
ucomisd %xmm1,%xmm0
seta   %al
mov    %al,-0x13(%rbp)
mov    -0x13(%rbp),%al
mov    %al,-0x12(%rbp)
mov    -0x12(%rbp),%al
mov    %al,-0x11(%rbp)
mov    -0x11(%rbp),%al
and    $0x1,%al
movzbl %al,%eax
movsbl %al,%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<fl_eq>:
xorpd  %xmm2,%xmm2
ucomisd %xmm2,%xmm0
jne    1117 <fl_eq+0x17>
jp     1117 <fl_eq+0x17>
mov    $0x1,%al
ucomisd %xmm2,%xmm1
jne    1117 <fl_eq+0x17>
jp     1117 <fl_eq+0x17>
ret
xor    %eax,%eax
ucomisd %xmm2,%xmm0
jne    1121 <fl_eq+0x21>
jnp    1116 <fl_eq+0x16>
xorpd  %xmm2,%xmm2
ucomisd %xmm2,%xmm1
jne    112d <fl_eq+0x2d>
jnp    1116 <fl_eq+0x16>
movapd %xmm0,%xmm3
divsd  %xmm1,%xmm3
xor    %eax,%eax
ucomisd %xmm2,%xmm3
jbe    1116 <fl_eq+0x16>
movsd  0xebb(%rip),%xmm2
ucomisd %xmm3,%xmm2
jbe    1116 <fl_eq+0x16>
divsd  %xmm0,%xmm1
ucomisd %xmm1,%xmm2
seta   %al
ret

LLVM IR (-O0):
define signext i8 @fl_eq(double %0, double %1) {
%3 = alloca double
%4 = alloca double
store double %0, double* %3
store double %1, double* %4
%5 = load double, double* %3
%6 = fcmp oeq double %5, 0.000000e+00
br i1 %6, label %7, label %10
7: ; preds = %2
%8 = load double, double* %4
%9 = fcmp oeq double %8, 0.000000e+00
br i1 %9, label %35, label %10
10: ; preds = %7, %2
%11 = load double, double* %3
%12 = fcmp oeq double %11, 0.000000e+00
br i1 %12, label %33, label %13
13: ; preds = %10
%14 = load double, double* %4
%15 = fcmp oeq double %14, 0.000000e+00
br i1 %15, label %33, label %16
16: ; preds = %13
%17 = load double, double* %3
%18 = load double, double* %4
%19 = fdiv double %17, %18
%20 = fcmp ogt double %19, 0.000000e+00
br i1 %20, label %21, label %33
21: ; preds = %16
%22 = load double, double* %3
%23 = load double, double* %4
%24 = fdiv double %22, %23
%25 = fcmp olt double %24, 1.000100e+00
br i1 %25, label %26, label %31
26: ; preds = %21
%27 = load double, double* %4
%28 = load double, double* %3
%29 = fdiv double %27, %28
%30 = fcmp olt double %29, 1.000100e+00
br label %31
31: ; preds = %26, %21
%32 = phi i1 [ false, %21 ], [ %30, %26 ]
br label %33
33: ; preds = %31, %16, %13, %10
%34 = phi i1 [ false, %16 ], [ false, %13 ], [ false, %10 ], [ %32, %31 ]
br label %35
35: ; preds = %33, %7
%36 = phi i1 [ true, %7 ], [ %34, %33 ]
%37 = zext i1 %36 to i32
%38 = trunc i32 %37 to i8
ret i8 %38
}

LLVM IR (-O2):
define signext i8 @fl_eq(double %0, double %1) {
%3 = fcmp oeq double %0, 0.000000e+00
%4 = fcmp oeq double %1, 0.000000e+00
%5 = and i1 %3, %4
br i1 %5, label %17, label %6
6: ; preds = %2
%7 = or i1 %3, %4
br i1 %7, label %17, label %8
8: ; preds = %6
%9 = fdiv double %0, %1
%10 = fcmp ogt double %9, 0.000000e+00
%11 = fcmp olt double %9, 1.000100e+00
%12 = and i1 %10, %11
br i1 %12, label %13, label %17
13: ; preds = %8
%14 = fdiv double %1, %0
%15 = fcmp olt double %14, 1.000100e+00
%16 = zext i1 %15 to i8
br label %17
17: ; preds = %6, %8, %13, %2
%18 = phi i8 [ 1, %2 ], [ 0, %8 ], [ 0, %6 ], [ %16, %13 ]
ret i8 %18
}