float StrToFloat(char *pstrfloat) {
  unsigned char bNegative = 0;
  unsigned char bDec = 0;
  char *pSor = 0;
  char chByte = '0';
  float fInteger = 0.0;
  float fDecimal = 0.0;
  float fDecPower = 0.1f;
  if (!pstrfloat) {
    return 0.0;
  }
  if (pstrfloat[0] == '-') {
    bNegative = 1;
    pSor = pstrfloat + 1;
  } else {
    bNegative = 0;
    pSor = pstrfloat;
  }
  while (*pSor != '\0') {
    chByte = *pSor;
    if (bDec) {
      if (chByte >= '0' && chByte <= '9') {
        fDecimal += (chByte - '0') * fDecPower;
        fDecPower = fDecPower * 0.1;
      } else {
        return (bNegative ? -(fInteger + fDecimal) : fInteger + fDecimal);
      }
    } else {
      if (chByte >= '0' && chByte <= '9') {
        fInteger = fInteger * 10.0 + chByte - '0';
      } else if (chByte == '.') {
        bDec = 1;
      } else {
        return (bNegative ? -fInteger : fInteger);
      }
    }
    pSor++;
  }
  return (bNegative ? -(fInteger + fDecimal) : fInteger + fDecimal);
}


x86 assembly (clang, -O0):
<StrToFloat>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
movb   $0x0,-0x11(%rbp)
movb   $0x0,-0x12(%rbp)
movq   $0x0,-0x20(%rbp)
movb   $0x30,-0x21(%rbp)
xorps  %xmm0,%xmm0
movss  %xmm0,-0x28(%rbp)
xorps  %xmm0,%xmm0
movss  %xmm0,-0x2c(%rbp)
movss  0xecc(%rip),%xmm0
movss  %xmm0,-0x30(%rbp)
cmpq   $0x0,-0x10(%rbp)
jne    1151 <StrToFloat+0x51>
xorps  %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    1369 <StrToFloat+0x269>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2d,%eax
jne    1176 <StrToFloat+0x76>
movb   $0x1,-0x11(%rbp)
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x20(%rbp)
jmp    1182 <StrToFloat+0x82>
movb   $0x0,-0x11(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x20(%rbp)
jmp    1187 <StrToFloat+0x87>
mov    -0x20(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
je     1322 <StrToFloat+0x222>
mov    -0x20(%rbp),%rax
mov    (%rax),%al
mov    %al,-0x21(%rbp)
cmpb   $0x0,-0x12(%rbp)
je     125a <StrToFloat+0x15a>
movsbl -0x21(%rbp),%eax
cmp    $0x30,%eax
jl     1209 <StrToFloat+0x109>
movsbl -0x21(%rbp),%eax
cmp    $0x39,%eax
jg     1209 <StrToFloat+0x109>
movsbl -0x21(%rbp),%eax
sub    $0x30,%eax
cvtsi2ss %eax,%xmm0
movss  -0x30(%rbp),%xmm2
movss  -0x2c(%rbp),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,-0x2c(%rbp)
movss  -0x30(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe21(%rip),%xmm1
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x30(%rbp)
jmp    1255 <StrToFloat+0x155>
movzbl -0x11(%rbp),%eax
cmp    $0x0,%eax
je     1237 <StrToFloat+0x137>
movss  -0x28(%rbp),%xmm0
addss  -0x2c(%rbp),%xmm0
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
movss  %xmm0,-0x34(%rbp)
jmp    1246 <StrToFloat+0x146>
movss  -0x28(%rbp),%xmm0
addss  -0x2c(%rbp),%xmm0
movss  %xmm0,-0x34(%rbp)
movss  -0x34(%rbp),%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    1369 <StrToFloat+0x269>
jmp    1311 <StrToFloat+0x211>
movsbl -0x21(%rbp),%eax
cmp    $0x30,%eax
jl     12af <StrToFloat+0x1af>
movsbl -0x21(%rbp),%eax
cmp    $0x39,%eax
jg     12af <StrToFloat+0x1af>
movss  -0x28(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsbl -0x21(%rbp),%eax
cvtsi2sd %eax,%xmm1
movsd  0xd83(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  0xd6b(%rip),%xmm1
subsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x28(%rbp)
jmp    130c <StrToFloat+0x20c>
movsbl -0x21(%rbp),%eax
cmp    $0x2e,%eax
jne    12c5 <StrToFloat+0x1c5>
movb   $0x1,-0x12(%rbp)
jmp    1307 <StrToFloat+0x207>
movzbl -0x11(%rbp),%eax
cmp    $0x0,%eax
je     12ee <StrToFloat+0x1ee>
movss  -0x28(%rbp),%xmm0
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
movss  %xmm0,-0x38(%rbp)
jmp    12f8 <StrToFloat+0x1f8>
movss  -0x28(%rbp),%xmm0
movss  %xmm0,-0x38(%rbp)
movss  -0x38(%rbp),%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    1369 <StrToFloat+0x269>
jmp    130c <StrToFloat+0x20c>
jmp    1311 <StrToFloat+0x211>
mov    -0x20(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x20(%rbp)
jmp    1187 <StrToFloat+0x87>
movzbl -0x11(%rbp),%eax
cmp    $0x0,%eax
je     1350 <StrToFloat+0x250>
movss  -0x28(%rbp),%xmm0
addss  -0x2c(%rbp),%xmm0
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
movss  %xmm0,-0x3c(%rbp)
jmp    135f <StrToFloat+0x25f>
movss  -0x28(%rbp),%xmm0
addss  -0x2c(%rbp),%xmm0
movss  %xmm0,-0x3c(%rbp)
movss  -0x3c(%rbp),%xmm0
movss  %xmm0,-0x4(%rbp)
movss  -0x4(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<StrToFloat>:
test   %rdi,%rdi
je     11be <StrToFloat+0xbe>
mov    (%rdi),%r8b
xor    %ecx,%ecx
cmp    $0x2d,%r8b
sete   %cl
mov    (%rdi,%rcx,1),%al
test   %al,%al
je     11d4 <StrToFloat+0xd4>
add    %rdi,%rcx
add    $0x1,%rcx
xorps  %xmm1,%xmm1
movss  0xece(%rip),%xmm2
xor    %edx,%edx
movsd  0xeec(%rip),%xmm3
movsd  0xeec(%rip),%xmm4
movsd  0xed4(%rip),%xmm5
xorps  %xmm0,%xmm0
jmp    117b <StrToFloat+0x7b>
cvtss2sd %xmm0,%xmm0
xorps  %xmm6,%xmm6
cvtsi2sd %edi,%xmm6
mulsd  %xmm3,%xmm0
addsd  %xmm6,%xmm0
addsd  %xmm4,%xmm0
cvtsd2ss %xmm0,%xmm0
xor    %edx,%edx
xchg   %ax,%ax
movzbl (%rcx),%eax
add    $0x1,%rcx
test   %al,%al
je     11c2 <StrToFloat+0xc2>
movsbl %al,%edi
lea    -0x30(%rdi),%esi
test   %dl,%dl
je     11b0 <StrToFloat+0xb0>
cmp    $0x9,%sil
ja     11c2 <StrToFloat+0xc2>
add    $0xffffffd0,%edi
xorps  %xmm6,%xmm6
cvtsi2ss %edi,%xmm6
mulss  %xmm2,%xmm6
addss  %xmm6,%xmm1
cvtss2sd %xmm2,%xmm2
mulsd  %xmm5,%xmm2
cvtsd2ss %xmm2,%xmm2
mov    $0x1,%dl
jmp    1170 <StrToFloat+0x70>
nopl   (%rax)
cmp    $0x9,%sil
jbe    1151 <StrToFloat+0x51>
mov    $0x1,%dl
cmp    $0x2e,%al
je     1170 <StrToFloat+0x70>
jmp    11c6 <StrToFloat+0xc6>
xorps  %xmm0,%xmm0
ret
addss  %xmm1,%xmm0
cmp    $0x2d,%r8b
jne    11d3 <StrToFloat+0xd3>
xorps  0xe3d(%rip),%xmm0
ret
xorps  %xmm0,%xmm0
cmp    $0x2d,%r8b
je     11cc <StrToFloat+0xcc>
jmp    11d3 <StrToFloat+0xd3>

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

LLVM IR (-O2):
define float @StrToFloat(i8* %0) {
%2 = icmp eq i8* %0, null
br i1 %2, label %59, label %3
3: ; preds = %1
%4 = load i8, i8* %0
%5 = icmp eq i8 %4, 45
%6 = zext i1 %5 to i64
%7 = getelementptr i8, i8* %0, i64 %6
%8 = load i8, i8* %7
%9 = icmp eq i8 %8, 0
br i1 %9, label %55, label %10
10: ; preds = %3, %45
%11 = phi i8 [ %51, %45 ], [ %8, %3 ]
%12 = phi float [ %49, %45 ], [ 0x3FB99999A0000000, %3 ]
%13 = phi float [ %48, %45 ], [ 0.000000e+00, %3 ]
%14 = phi float [ %47, %45 ], [ 0.000000e+00, %3 ]
%15 = phi i8* [ %50, %45 ], [ %7, %3 ]
%16 = phi i8 [ %46, %45 ], [ 0, %3 ]
%17 = sext i8 %11 to i32
%18 = icmp eq i8 %16, 0
%19 = add i8 %11, -48
%20 = icmp ult i8 %19, 10
br i1 %18, label %33, label %21
21: ; preds = %10
br i1 %20, label %22, label %29
22: ; preds = %21
%23 = add nsw i32 %17, -48
%24 = sitofp i32 %23 to float
%25 = tail call float @llvm.fmuladd.f32(float %24, float %12, float %13)
%26 = fpext float %12 to double
%27 = fmul double %26, 1.000000e-01
%28 = fptrunc double %27 to float
br label %45
29: ; preds = %21
%30 = fadd float %14, %13
%31 = fneg float %30
%32 = select i1 %5, float %31, float %30
br label %59
33: ; preds = %10
br i1 %20, label %34, label %40
34: ; preds = %33
%35 = fpext float %14 to double
%36 = sitofp i8 %11 to double
%37 = tail call double @llvm.fmuladd.f64(double %35, double 1.000000e+01, double %36)
%38 = fadd double %37, -4.800000e+01
%39 = fptrunc double %38 to float
br label %45
40: ; preds = %33
%41 = icmp eq i8 %11, 46
br i1 %41, label %45, label %42
42: ; preds = %40
%43 = fneg float %14
%44 = select i1 %5, float %43, float %14
br label %59
45: ; preds = %40, %34, %22
%46 = phi i8 [ 1, %22 ], [ 0, %34 ], [ 1, %40 ]
%47 = phi float [ %14, %22 ], [ %39, %34 ], [ %14, %40 ]
%48 = phi float [ %25, %22 ], [ %13, %34 ], [ %13, %40 ]
%49 = phi float [ %28, %22 ], [ %12, %34 ], [ %12, %40 ]
%50 = getelementptr inbounds i8, i8* %15, i64 1
%51 = load i8, i8* %50
%52 = icmp eq i8 %51, 0
br i1 %52, label %53, label %10
53: ; preds = %45
%54 = fadd float %47, %48
br label %55
55: ; preds = %53, %3
%56 = phi float [ %54, %53 ], [ 0.000000e+00, %3 ]
%57 = fneg float %56
%58 = select i1 %5, float %57, float %56
br label %59
59: ; preds = %1, %55, %42, %29
%60 = phi float [ %32, %29 ], [ %44, %42 ], [ %58, %55 ], [ 0.000000e+00, %1 ]
ret float %60
}