int main() {
  float fa0 = .123f;
  float fa1 = .123E12F;
  float fa2 = .123e-12f;
  float fa3 = .123e+12f;
  printf("%f\n%f\n%f\n%f\n\n", fa0, fa1, fa2, fa3);
  float fb0 = 123.123f;
  float fb1 = 123.123E12F;
  float fb2 = 123.123e-12f;
  float fb3 = 123.123e+12f;
  printf("%f\n%f\n%f\n%f\n\n", fb0, fb1, fb2, fb3);
  float fc0 = 123.f;
  float fc1 = 123.E12F;
  float fc2 = 123.e-12f;
  float fc3 = 123.e+12f;
  printf("%f\n%f\n%f\n%f\n\n", fc0, fc1, fc2, fc3);
  float fd0 = 123E12F;
  float fd1 = 123e-12f;
  float fd2 = 123e+12f;
  printf("%f\n%f\n%f\n\n", fd0, fd1, fd2);
  printf("\n");
  double da0 = 0X.1ACP12;
  double da1 = 0x.1acp-12;
  double da2 = 0x.1acp+12;
  printf("%f\n%f\n%f\n\n", da0, da1, da2);
  double db0 = 0X1AC.BDP12;
  double db1 = 0x1ac.bdp-12;
  double db2 = 0x1ac.dbp+12;
  printf("%f\n%f\n%f\n\n", db0, db1, db2);
  double dc0 = 0X1AC.P12;
  double dc1 = 0x1ac.p-12;
  double dc2 = 0x1ac.p+12;
  printf("%f\n%f\n%f\n\n", dc0, dc1, dc2);
  double dd0 = 0X1ACP12;
  double dd1 = 0x1acp-12;
  double dd2 = 0x1acp+12;
  printf("%f\n%f\n%f\n\n", dd0, dd1, dd2);
  printf("\n");
  return 0;
}


x86 assembly (clang, -O0):
<main>:
push   %rbp
mov    %rsp,%rbp
sub    $0xa0,%rsp
movl   $0x0,-0x4(%rbp)
movss  0xf2e(%rip),%xmm0
movss  %xmm0,-0x8(%rbp)
movss  0xf19(%rip),%xmm0
movss  %xmm0,-0xc(%rbp)
movss  0xf10(%rip),%xmm0
movss  %xmm0,-0x10(%rbp)
movss  0xeff(%rip),%xmm0
movss  %xmm0,-0x14(%rbp)
movss  -0x8(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movss  -0xc(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
movss  -0x10(%rbp),%xmm2
cvtss2sd %xmm2,%xmm2
movss  -0x14(%rbp),%xmm3
cvtss2sd %xmm3,%xmm3
lea    0xedb(%rip),%rdi
mov    $0x4,%al
call   1030 <printf@plt>
movss  0xebc(%rip),%xmm0
movss  %xmm0,-0x18(%rbp)
movss  0xea7(%rip),%xmm0
movss  %xmm0,-0x1c(%rbp)
movss  0xe9e(%rip),%xmm0
movss  %xmm0,-0x20(%rbp)
movss  0xe8d(%rip),%xmm0
movss  %xmm0,-0x24(%rbp)
movss  -0x18(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movss  -0x1c(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
movss  -0x20(%rbp),%xmm2
cvtss2sd %xmm2,%xmm2
movss  -0x24(%rbp),%xmm3
cvtss2sd %xmm3,%xmm3
lea    0xe75(%rip),%rdi
mov    $0x4,%al
call   1030 <printf@plt>
movss  0xe4a(%rip),%xmm0
movss  %xmm0,-0x28(%rbp)
movss  0xe35(%rip),%xmm0
movss  %xmm0,-0x2c(%rbp)
movss  0xe2c(%rip),%xmm0
movss  %xmm0,-0x30(%rbp)
movss  0xe1b(%rip),%xmm0
movss  %xmm0,-0x34(%rbp)
movss  -0x28(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movss  -0x2c(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
movss  -0x30(%rbp),%xmm2
cvtss2sd %xmm2,%xmm2
movss  -0x34(%rbp),%xmm3
cvtss2sd %xmm3,%xmm3
lea    0xe0f(%rip),%rdi
mov    $0x4,%al
call   1030 <printf@plt>
movss  0xddc(%rip),%xmm0
movss  %xmm0,-0x38(%rbp)
movss  0xdd3(%rip),%xmm0
movss  %xmm0,-0x3c(%rbp)
movss  0xdc2(%rip),%xmm0
movss  %xmm0,-0x40(%rbp)
movss  -0x38(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movss  -0x3c(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
movss  -0x40(%rbp),%xmm2
cvtss2sd %xmm2,%xmm2
lea    0xdc2(%rip),%rdi
mov    $0x3,%al
call   1030 <printf@plt>
lea    0xdbd(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
movsd  0xd6e(%rip),%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  0xd69(%rip),%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  0xd54(%rip),%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  -0x48(%rbp),%xmm0
movsd  -0x50(%rbp),%xmm1
movsd  -0x58(%rbp),%xmm2
lea    0xd70(%rip),%rdi
mov    $0x3,%al
call   1030 <printf@plt>
movsd  0xd22(%rip),%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  0xd0d(%rip),%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  0xcf8(%rip),%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0x60(%rbp),%xmm0
movsd  -0x68(%rbp),%xmm1
movsd  -0x70(%rbp),%xmm2
lea    0xd2c(%rip),%rdi
mov    $0x3,%al
call   1030 <printf@plt>
movsd  0xcbe(%rip),%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  0xcb9(%rip),%xmm0
movsd  %xmm0,-0x80(%rbp)
movsd  0xca4(%rip),%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
movsd  -0x78(%rbp),%xmm0
movsd  -0x80(%rbp),%xmm1
movsd  -0x88(%rbp),%xmm2
ff
lea    0xce2(%rip),%rdi
mov    $0x3,%al
call   1030 <printf@plt>
movsd  0xc74(%rip),%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
movsd  0xc6c(%rip),%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
movsd  0xc54(%rip),%xmm0
movsd  %xmm0,-0xa0(%rbp)
ff
movsd  -0x90(%rbp),%xmm0
ff
movsd  -0x98(%rbp),%xmm1
ff
movsd  -0xa0(%rbp),%xmm2
ff
lea    0xc8c(%rip),%rdi
mov    $0x3,%al
call   1030 <printf@plt>
lea    0xc87(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
xor    %eax,%eax
add    $0xa0,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<main>:
push   %rbx
lea    0xf58(%rip),%rbx
movsd  0xed0(%rip),%xmm0
movsd  0xed0(%rip),%xmm2
movsd  0xed0(%rip),%xmm1
mov    %rbx,%rdi
movaps %xmm1,%xmm3
mov    $0x4,%al
call   1040 <printf@plt>
movsd  0xec3(%rip),%xmm0
movsd  0xec3(%rip),%xmm2
movsd  0xec3(%rip),%xmm1
mov    %rbx,%rdi
movaps %xmm1,%xmm3
mov    $0x4,%al
call   1040 <printf@plt>
movsd  0xeb6(%rip),%xmm0
movsd  0xeb6(%rip),%xmm2
movsd  0xeb6(%rip),%xmm1
mov    %rbx,%rdi
movaps %xmm1,%xmm3
mov    $0x4,%al
call   1040 <printf@plt>
lea    0xee5(%rip),%rbx
mov    %rbx,%rdi
movsd  0xe97(%rip),%xmm0
movsd  0xe87(%rip),%xmm1
movaps %xmm0,%xmm2
mov    $0x3,%al
call   1040 <printf@plt>
mov    $0xa,%edi
call   1030 <putchar@plt>
movsd  0xe7b(%rip),%xmm1
movsd  0xe7b(%rip),%xmm0
mov    %rbx,%rdi
movaps %xmm0,%xmm2
mov    $0x3,%al
call   1040 <printf@plt>
movsd  0xe6e(%rip),%xmm0
movsd  0xe6e(%rip),%xmm1
movsd  0xe6e(%rip),%xmm2
mov    %rbx,%rdi
mov    $0x3,%al
call   1040 <printf@plt>
movsd  0xe64(%rip),%xmm1
movsd  0xe64(%rip),%xmm0
mov    %rbx,%rdi
movaps %xmm0,%xmm2
mov    $0x3,%al
call   1040 <printf@plt>
mov    %rbx,%rdi
movsd  0xe4c(%rip),%xmm0
movsd  0xe3c(%rip),%xmm1
movaps %xmm0,%xmm2
mov    $0x3,%al
call   1040 <printf@plt>
mov    $0xa,%edi
call   1030 <putchar@plt>
xor    %eax,%eax
pop    %rbx
ret

LLVM IR (-O0):
@.str = [14 x i8] c"%f\0A%f\0A%f\0A%f\0A\0A\00"
@.str.1 = [11 x i8] c"%f\0A%f\0A%f\0A\0A\00"
@.str.2 = [2 x i8] c"\0A\00"
define i32 @main() {
%1 = alloca i32
%2 = alloca float
%3 = alloca float
%4 = alloca float
%5 = alloca float
%6 = alloca float
%7 = alloca float
%8 = alloca float
%9 = alloca float
%10 = alloca float
%11 = alloca float
%12 = alloca float
%13 = alloca float
%14 = alloca float
%15 = alloca float
%16 = alloca float
%17 = alloca double
%18 = alloca double
%19 = alloca double
%20 = alloca double
%21 = alloca double
%22 = alloca double
%23 = alloca double
%24 = alloca double
%25 = alloca double
%26 = alloca double
%27 = alloca double
%28 = alloca double
store i32 0, i32* %1
store float 0x3FBF7CEDA0000000, float* %2
store float 0x423CA35F00000000, float* %3
store float 0x3D414F8AC0000000, float* %4
store float 0x423CA35F00000000, float* %5
%29 = load float, float* %2
%30 = fpext float %29 to double
%31 = load float, float* %3
%32 = fpext float %31 to double
%33 = load float, float* %4
%34 = fpext float %33 to double
%35 = load float, float* %5
%36 = fpext float %35 to double
%37 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str, i64 0, i64 0), double %30, double %32, double %34, double %36)
store float 0x405EC7DF40000000, float* %6
store float 0x42DBFEB3A0000000, float* %7
store float 0x3DE0EC0160000000, float* %8
store float 0x42DBFEB3A0000000, float* %9
%38 = load float, float* %6
%39 = fpext float %38 to double
%40 = load float, float* %7
%41 = fpext float %40 to double
%42 = load float, float* %8
%43 = fpext float %42 to double
%44 = load float, float* %9
%45 = fpext float %44 to double
%46 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str, i64 0, i64 0), double %39, double %41, double %43, double %45)
store float 1.230000e+02, float* %10
store float 0x42DBF78AE0000000, float* %11
store float 0x3DE0E7AD80000000, float* %12
store float 0x42DBF78AE0000000, float* %13
%47 = load float, float* %10
%48 = fpext float %47 to double
%49 = load float, float* %11
%50 = fpext float %49 to double
%51 = load float, float* %12
%52 = fpext float %51 to double
%53 = load float, float* %13
%54 = fpext float %53 to double
%55 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str, i64 0, i64 0), double %48, double %50, double %52, double %54)
store float 0x42DBF78AE0000000, float* %14
store float 0x3DE0E7AD80000000, float* %15
store float 0x42DBF78AE0000000, float* %16
%56 = load float, float* %14
%57 = fpext float %56 to double
%58 = load float, float* %15
%59 = fpext float %58 to double
%60 = load float, float* %16
%61 = fpext float %60 to double
%62 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.1, i64 0, i64 0), double %57, double %59, double %61)
%63 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.2, i64 0, i64 0))
store double 4.280000e+02, double* %17
store double 0x3EFAC00000000000, double* %18
store double 4.280000e+02, double* %19
%64 = load double, double* %17
%65 = load double, double* %18
%66 = load double, double* %19
%67 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.1, i64 0, i64 0), double %64, double %65, double %66)
store double 0x413ACBD000000000, double* %20
store double 0x3FBACBD000000000, double* %21
store double 0x413ACDB000000000, double* %22
%68 = load double, double* %20
%69 = load double, double* %21
%70 = load double, double* %22
%71 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.1, i64 0, i64 0), double %68, double %69, double %70)
store double 0x413AC00000000000, double* %23
store double 0x3FBAC00000000000, double* %24
store double 0x413AC00000000000, double* %25
%72 = load double, double* %23
%73 = load double, double* %24
%74 = load double, double* %25
%75 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.1, i64 0, i64 0), double %72, double %73, double %74)
store double 0x413AC00000000000, double* %26
store double 0x3FBAC00000000000, double* %27
store double 0x413AC00000000000, double* %28
%76 = load double, double* %26
%77 = load double, double* %27
%78 = load double, double* %28
%79 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.1, i64 0, i64 0), double %76, double %77, double %78)
%80 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.2, i64 0, i64 0))
ret i32 0
}

LLVM IR (-O2):
@.str = [14 x i8] c"%f\0A%f\0A%f\0A%f\0A\0A\00"
@.str.1 = [11 x i8] c"%f\0A%f\0A%f\0A\0A\00"
define i32 @main() {
%1 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([14 x i8], [14 x i8]* @.str, i64 0, i64 0), double 0x3FBF7CEDA0000000, double 0x423CA35F00000000, double 0x3D414F8AC0000000, double 0x423CA35F00000000)
%2 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([14 x i8], [14 x i8]* @.str, i64 0, i64 0), double 0x405EC7DF40000000, double 0x42DBFEB3A0000000, double 0x3DE0EC0160000000, double 0x42DBFEB3A0000000)
%3 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([14 x i8], [14 x i8]* @.str, i64 0, i64 0), double 1.230000e+02, double 0x42DBF78AE0000000, double 0x3DE0E7AD80000000, double 0x42DBF78AE0000000)
%4 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([11 x i8], [11 x i8]* @.str.1, i64 0, i64 0), double 0x42DBF78AE0000000, double 0x3DE0E7AD80000000, double 0x42DBF78AE0000000)
%5 = tail call i32 @putchar(i32 10)
%6 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([11 x i8], [11 x i8]* @.str.1, i64 0, i64 0), double 4.280000e+02, double 0x3EFAC00000000000, double 4.280000e+02)
%7 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([11 x i8], [11 x i8]* @.str.1, i64 0, i64 0), double 0x413ACBD000000000, double 0x3FBACBD000000000, double 0x413ACDB000000000)
%8 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([11 x i8], [11 x i8]* @.str.1, i64 0, i64 0), double 0x413AC00000000000, double 0x3FBAC00000000000, double 0x413AC00000000000)
%9 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([11 x i8], [11 x i8]* @.str.1, i64 0, i64 0), double 0x413AC00000000000, double 0x3FBAC00000000000, double 0x413AC00000000000)
%10 = tail call i32 @putchar(i32 10)
ret i32 0
}