#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
double pow(int, int);
double pre2dec(int a, int b, int c, int d, int e) {
  int para[3];
  para[0] = a;
  para[1] = b;
  para[2] = c;
  int m[3];
  m[0] = 16;
  m[1] = 15, m[2] = 13;
  int M[3];
  M[0] = 1 * m[1] * m[2];
  M[1] = 1 * m[0] * m[2];
  M[2] = 1 * m[0] * m[1];
  int x = 0;
  int i = 0;
  for (i = 0; i < 3; i++) {
    int y1 = 1;
    while (!(((M[i] * y1) % m[i]) == 1)) {
      y1++;
    }
    x += M[i] * y1 * para[i];
  }
  while (x > m[0] * m[1] * m[2]) {
    x -= m[0] * m[1] * m[2];
  }
  double xf;
  xf = (double)x;
  xf *= pow(10, -d);
  if (e == 0)
    xf = -xf;
  return xf;
}


x86 assembly (clang, -O0):
<pre2dec>:
push   %rbp
mov    %rsp,%rbp
sub    $0x50,%rsp
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
mov    %edx,-0xc(%rbp)
mov    %ecx,-0x10(%rbp)
mov    %r8d,-0x14(%rbp)
mov    -0x4(%rbp),%eax
mov    %eax,-0x20(%rbp)
mov    -0x8(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0xc(%rbp),%eax
mov    %eax,-0x18(%rbp)
movl   $0x10,-0x2c(%rbp)
movl   $0xf,-0x28(%rbp)
movl   $0xd,-0x24(%rbp)
mov    -0x28(%rbp),%eax
shl    $0x0,%eax
imul   -0x24(%rbp),%eax
mov    %eax,-0x38(%rbp)
mov    -0x2c(%rbp),%eax
shl    $0x0,%eax
imul   -0x24(%rbp),%eax
mov    %eax,-0x34(%rbp)
mov    -0x2c(%rbp),%eax
shl    $0x0,%eax
imul   -0x28(%rbp),%eax
mov    %eax,-0x30(%rbp)
movl   $0x0,-0x3c(%rbp)
movl   $0x0,-0x40(%rbp)
movl   $0x0,-0x40(%rbp)
cmpl   $0x3,-0x40(%rbp)
jge    11fd <pre2dec+0xed>
movl   $0x1,-0x44(%rbp)
movslq -0x40(%rbp),%rax
mov    -0x38(%rbp,%rax,4),%eax
imul   -0x44(%rbp),%eax
movslq -0x40(%rbp),%rcx
cltd
idivl  -0x2c(%rbp,%rcx,4)
cmp    $0x1,%edx
sete   %al
xor    $0xff,%al
test   $0x1,%al
jne    11c6 <pre2dec+0xb6>
jmp    11d4 <pre2dec+0xc4>
mov    -0x44(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x44(%rbp)
jmp    119c <pre2dec+0x8c>
movslq -0x40(%rbp),%rax
mov    -0x38(%rbp,%rax,4),%eax
imul   -0x44(%rbp),%eax
movslq -0x40(%rbp),%rcx
imul   -0x20(%rbp,%rcx,4),%eax
add    -0x3c(%rbp),%eax
mov    %eax,-0x3c(%rbp)
mov    -0x40(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x40(%rbp)
jmp    118b <pre2dec+0x7b>
jmp    1202 <pre2dec+0xf2>
mov    -0x3c(%rbp),%eax
mov    -0x2c(%rbp),%ecx
imul   -0x28(%rbp),%ecx
imul   -0x24(%rbp),%ecx
cmp    %ecx,%eax
jle    1230 <pre2dec+0x120>
mov    -0x2c(%rbp),%ecx
imul   -0x28(%rbp),%ecx
imul   -0x24(%rbp),%ecx
mov    -0x3c(%rbp),%eax
sub    %ecx,%eax
mov    %eax,-0x3c(%rbp)
jmp    1202 <pre2dec+0xf2>
cvtsi2sdl -0x3c(%rbp),%xmm0
movsd  %xmm0,-0x50(%rbp)
xor    %esi,%esi
sub    -0x10(%rbp),%esi
mov    $0xa,%edi
call   1030 <pow@plt>
mulsd  -0x50(%rbp),%xmm0
movsd  %xmm0,-0x50(%rbp)
cmpl   $0x0,-0x14(%rbp)
jne    127e <pre2dec+0x16e>
movsd  -0x50(%rbp),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  -0x50(%rbp),%xmm0
add    $0x50,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<pre2dec>:
push   %rbx
sub    $0x10,%rsp
mov    %r8d,%ebx
imul   $0x5b0,%esi,%eax
imul   $0x861,%edi,%esi
add    %eax,%esi
imul   $0xa50,%edx,%eax
add    %esi,%eax
cmp    $0xc30,%eax
mov    $0xc30,%edx
cmovl  %eax,%edx
mov    %eax,%esi
sub    %edx,%esi
add    $0xc2f,%esi
mov    %esi,%edx
shr    $0x4,%edx
imul   $0xa80a80b,%rdx,%rdx
shr    $0x23,%rdx
imul   $0xc30,%edx,%edx
mov    %esi,%edi
sub    %edx,%edi
sub    %esi,%edi
add    %eax,%edi
cvtsi2sd %edi,%xmm0
movsd  %xmm0,0x8(%rsp)
neg    %ecx
mov    $0xa,%edi
mov    %ecx,%esi
call   1030 <pow@plt>
mulsd  0x8(%rsp),%xmm0
test   %ebx,%ebx
jne    118d <pre2dec+0x7d>
xorpd  0xe73(%rip),%xmm0
add    $0x10,%rsp
pop    %rbx
ret

LLVM IR (-O0):
define double @pre2dec(i32 %0, i32 %1, i32 %2, i32 %3, i32 %4) {
%6 = alloca i32
%7 = alloca i32
%8 = alloca i32
%9 = alloca i32
%10 = alloca i32
%11 = alloca [3 x i32]
%12 = alloca [3 x i32]
%13 = alloca [3 x i32]
%14 = alloca i32
%15 = alloca i32
%16 = alloca i32
%17 = alloca double
store i32 %0, i32* %6
store i32 %1, i32* %7
store i32 %2, i32* %8
store i32 %3, i32* %9
store i32 %4, i32* %10
%18 = load i32, i32* %6
%19 = getelementptr inbounds [3 x i32], [3 x i32]* %11, i64 0, i64 0
store i32 %18, i32* %19
%20 = load i32, i32* %7
%21 = getelementptr inbounds [3 x i32], [3 x i32]* %11, i64 0, i64 1
store i32 %20, i32* %21
%22 = load i32, i32* %8
%23 = getelementptr inbounds [3 x i32], [3 x i32]* %11, i64 0, i64 2
store i32 %22, i32* %23
%24 = getelementptr inbounds [3 x i32], [3 x i32]* %12, i64 0, i64 0
store i32 16, i32* %24
%25 = getelementptr inbounds [3 x i32], [3 x i32]* %12, i64 0, i64 1
store i32 15, i32* %25
%26 = getelementptr inbounds [3 x i32], [3 x i32]* %12, i64 0, i64 2
store i32 13, i32* %26
%27 = getelementptr inbounds [3 x i32], [3 x i32]* %12, i64 0, i64 1
%28 = load i32, i32* %27
%29 = mul nsw i32 1, %28
%30 = getelementptr inbounds [3 x i32], [3 x i32]* %12, i64 0, i64 2
%31 = load i32, i32* %30
%32 = mul nsw i32 %29, %31
%33 = getelementptr inbounds [3 x i32], [3 x i32]* %13, i64 0, i64 0
store i32 %32, i32* %33
%34 = getelementptr inbounds [3 x i32], [3 x i32]* %12, i64 0, i64 0
%35 = load i32, i32* %34
%36 = mul nsw i32 1, %35
%37 = getelementptr inbounds [3 x i32], [3 x i32]* %12, i64 0, i64 2
%38 = load i32, i32* %37
%39 = mul nsw i32 %36, %38
%40 = getelementptr inbounds [3 x i32], [3 x i32]* %13, i64 0, i64 1
store i32 %39, i32* %40
%41 = getelementptr inbounds [3 x i32], [3 x i32]* %12, i64 0, i64 0
%42 = load i32, i32* %41
%43 = mul nsw i32 1, %42
%44 = getelementptr inbounds [3 x i32], [3 x i32]* %12, i64 0, i64 1
%45 = load i32, i32* %44
%46 = mul nsw i32 %43, %45
%47 = getelementptr inbounds [3 x i32], [3 x i32]* %13, i64 0, i64 2
store i32 %46, i32* %47
store i32 0, i32* %14
store i32 0, i32* %15
store i32 0, i32* %15
br label %48
48: ; preds = %83, %5
%49 = load i32, i32* %15
%50 = icmp slt i32 %49, 3
br i1 %50, label %51, label %86
51: ; preds = %48
store i32 1, i32* %16
br label %52
52: ; preds = %66, %51
%53 = load i32, i32* %15
%54 = sext i32 %53 to i64
%55 = getelementptr inbounds [3 x i32], [3 x i32]* %13, i64 0, i64 %54
%56 = load i32, i32* %55
%57 = load i32, i32* %16
%58 = mul nsw i32 %56, %57
%59 = load i32, i32* %15
%60 = sext i32 %59 to i64
%61 = getelementptr inbounds [3 x i32], [3 x i32]* %12, i64 0, i64 %60
%62 = load i32, i32* %61
%63 = srem i32 %58, %62
%64 = icmp eq i32 %63, 1
%65 = xor i1 %64, true
br i1 %65, label %66, label %69
66: ; preds = %52
%67 = load i32, i32* %16
%68 = add nsw i32 %67, 1
store i32 %68, i32* %16
br label %52
69: ; preds = %52
%70 = load i32, i32* %15
%71 = sext i32 %70 to i64
%72 = getelementptr inbounds [3 x i32], [3 x i32]* %13, i64 0, i64 %71
%73 = load i32, i32* %72
%74 = load i32, i32* %16
%75 = mul nsw i32 %73, %74
%76 = load i32, i32* %15
%77 = sext i32 %76 to i64
%78 = getelementptr inbounds [3 x i32], [3 x i32]* %11, i64 0, i64 %77
%79 = load i32, i32* %78
%80 = mul nsw i32 %75, %79
%81 = load i32, i32* %14
%82 = add nsw i32 %81, %80
store i32 %82, i32* %14
br label %83
83: ; preds = %69
%84 = load i32, i32* %15
%85 = add nsw i32 %84, 1
store i32 %85, i32* %15
br label %48
86: ; preds = %48
br label %87
87: ; preds = %98, %86
%88 = load i32, i32* %14
%89 = getelementptr inbounds [3 x i32], [3 x i32]* %12, i64 0, i64 0
%90 = load i32, i32* %89
%91 = getelementptr inbounds [3 x i32], [3 x i32]* %12, i64 0, i64 1
%92 = load i32, i32* %91
%93 = mul nsw i32 %90, %92
%94 = getelementptr inbounds [3 x i32], [3 x i32]* %12, i64 0, i64 2
%95 = load i32, i32* %94
%96 = mul nsw i32 %93, %95
%97 = icmp sgt i32 %88, %96
br i1 %97, label %98, label %109
98: ; preds = %87
%99 = getelementptr inbounds [3 x i32], [3 x i32]* %12, i64 0, i64 0
%100 = load i32, i32* %99
%101 = getelementptr inbounds [3 x i32], [3 x i32]* %12, i64 0, i64 1
%102 = load i32, i32* %101
%103 = mul nsw i32 %100, %102
%104 = getelementptr inbounds [3 x i32], [3 x i32]* %12, i64 0, i64 2
%105 = load i32, i32* %104
%106 = mul nsw i32 %103, %105
%107 = load i32, i32* %14
%108 = sub nsw i32 %107, %106
store i32 %108, i32* %14
br label %87
109: ; preds = %87
%110 = load i32, i32* %14
%111 = sitofp i32 %110 to double
store double %111, double* %17
%112 = load i32, i32* %9
%113 = sub nsw i32 0, %112
%114 = call double @pow(i32 10, i32 %113)
%115 = load double, double* %17
%116 = fmul double %115, %114
store double %116, double* %17
%117 = load i32, i32* %10
%118 = icmp eq i32 %117, 0
br i1 %118, label %119, label %122
119: ; preds = %109
%120 = load double, double* %17
%121 = fneg double %120
store double %121, double* %17
br label %122
122: ; preds = %119, %109
%123 = load double, double* %17
ret double %123
}

LLVM IR (-O2):
define double @pre2dec(i32 %0, i32 %1, i32 %2, i32 %3, i32 %4) {
%6 = mul i32 %1, 1456
%7 = mul i32 %0, 2145
%8 = add i32 %6, %7
%9 = mul i32 %2, 2640
%10 = add i32 %9, %8
%11 = add i32 %10, 3119
%12 = call i32 @llvm.smin.i32(i32 %10, i32 3120)
%13 = sub i32 %11, %12
%14 = urem i32 %13, 3120
%15 = sub i32 %14, %13
%16 = add i32 %15, %10
%17 = sitofp i32 %16 to double
%18 = sub nsw i32 0, %3
%19 = tail call double @pow(i32 10, i32 %18)
%20 = fmul double %19, %17
%21 = icmp eq i32 %4, 0
%22 = fneg double %20
%23 = select i1 %21, double %22, double %20
ret double %23
}