float frand() {
  long a = 16807, m = 2147483647, q = 127773, r = 2836;
  long hi, lo;
  static long seed = 31207321;
  float fnumb;
  hi = seed / q;
  lo = seed - q * hi;
  seed = a * lo - r * hi;
  if (seed <= 0)
    seed = seed + m;
  fnumb = seed / 2147483646.0;
  return (fnumb);
}


x86 assembly (clang, -O0):
<frand>:
push   %rbp
mov    %rsp,%rbp
movq   $0x41a7,-0x8(%rbp)
movq   $0x7fffffff,-0x10(%rbp)
7f
movq   $0x1f31d,-0x18(%rbp)
movq   $0xb14,-0x20(%rbp)
mov    0x2ef5(%rip),%rax
cqto
idivq  -0x18(%rbp)
mov    %rax,-0x28(%rbp)
mov    0x2ee4(%rip),%rax
mov    -0x18(%rbp),%rcx
imul   -0x28(%rbp),%rcx
sub    %rcx,%rax
mov    %rax,-0x30(%rbp)
mov    -0x8(%rbp),%rax
imul   -0x30(%rbp),%rax
mov    -0x20(%rbp),%rcx
imul   -0x28(%rbp),%rcx
sub    %rcx,%rax
mov    %rax,0x2eb8(%rip)
cmpq   $0x0,0x2eb0(%rip)
jg     1188 <frand+0x88>
mov    0x2ea3(%rip),%rax
add    -0x10(%rbp),%rax
mov    %rax,0x2e98(%rip)
cvtsi2sdq 0x2e8f(%rip),%xmm0
movsd  0xe67(%rip),%xmm1
divsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x34(%rbp)
movss  -0x34(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<frand>:
mov    0x2f19(%rip),%rcx
movabs $0x41a705af1fe3fb79,%rdx
05 a7 41
mov    %rcx,%rax
imul   %rdx
mov    %rdx,%rax
shr    $0x3f,%rax
sar    $0xf,%rdx
add    %rax,%rdx
imul   $0xfffffffffffe0ce3,%rdx,%rax
add    %rcx,%rax
imul   $0x41a7,%rax,%rax
imul   $0xfffffffffffff4ec,%rdx,%rcx
lea    (%rax,%rcx,1),%rdx
test   %rdx,%rdx
lea    0x7fffffff(%rax,%rcx,1),%rax
7f
cmovg  %rdx,%rax
mov    %rax,0x2ec9(%rip)
cvtsi2sd %rax,%xmm0
divsd  0xe9c(%rip),%xmm0
cvtsd2ss %xmm0,%xmm0
ret

LLVM IR (-O0):
@frand.seed = internal global i64 31207321
define float @frand() {
%1 = alloca i64
%2 = alloca i64
%3 = alloca i64
%4 = alloca i64
%5 = alloca i64
%6 = alloca i64
%7 = alloca float
store i64 16807, i64* %1
store i64 2147483647, i64* %2
store i64 127773, i64* %3
store i64 2836, i64* %4
%8 = load i64, i64* @frand.seed
%9 = load i64, i64* %3
%10 = sdiv i64 %8, %9
store i64 %10, i64* %5
%11 = load i64, i64* @frand.seed
%12 = load i64, i64* %3
%13 = load i64, i64* %5
%14 = mul nsw i64 %12, %13
%15 = sub nsw i64 %11, %14
store i64 %15, i64* %6
%16 = load i64, i64* %1
%17 = load i64, i64* %6
%18 = mul nsw i64 %16, %17
%19 = load i64, i64* %4
%20 = load i64, i64* %5
%21 = mul nsw i64 %19, %20
%22 = sub nsw i64 %18, %21
store i64 %22, i64* @frand.seed
%23 = load i64, i64* @frand.seed
%24 = icmp sle i64 %23, 0
br i1 %24, label %25, label %29
25: ; preds = %0
%26 = load i64, i64* @frand.seed
%27 = load i64, i64* %2
%28 = add nsw i64 %26, %27
store i64 %28, i64* @frand.seed
br label %29
29: ; preds = %25, %0
%30 = load i64, i64* @frand.seed
%31 = sitofp i64 %30 to double
%32 = fdiv double %31, 0x41DFFFFFFF800000
%33 = fptrunc double %32 to float
store float %33, float* %7
%34 = load float, float* %7
ret float %34
}

LLVM IR (-O2):
@frand.seed = internal unnamed_addr global i64 31207321
define float @frand() {
%1 = load i64, i64* @frand.seed
%2 = sdiv i64 %1, 127773
%3 = mul nsw i64 %2, -127773
%4 = add i64 %3, %1
%5 = mul nsw i64 %4, 16807
%6 = mul nsw i64 %2, -2836
%7 = add i64 %5, %6
%8 = icmp slt i64 %7, 1
%9 = add nsw i64 %7, 2147483647
%10 = select i1 %8, i64 %9, i64 %7
store i64 %10, i64* @frand.seed
%11 = sitofp i64 %10 to double
%12 = fdiv double %11, 0x41DFFFFFFF800000
%13 = fptrunc double %12 to float
ret float %13
}