title: implemented atof that named atof_beta, but the result isn't the same as atof
body: <p>i wrote a atof function which named atof_beta.i run it, but the result was not the same as atof's result.</p>
  
  <p>for example:
  input:1111111111111111111111111111111111111111111111111111111111111111111111111111111111</p>
  
  <p>output:(fabs(val-atof(s)) &lt;= EPSILON) equal zero.</p>
  
  <pre><code>#include &lt;stdio.h&gt;
  #include &lt;stdlib.h&gt;
  #include &lt;string.h&gt;
  #include &lt;ctype.h&gt;
  #include &lt;limits.h&gt;
  #include &lt;float.h&gt;
  #include &lt;math.h&gt;
  
  double check_overflow(double val)
  {
      if (val &gt; DBL_MAX){
          return DBL_MAX;
      }else if (val &lt;  DBL_MIN){
          return DBL_MIN;
      }
      return val;
  }
  
  
  double get_exp(char *s)
  {
      double exp = 10;
      int num = 0x00;
      char c = *s;
  
      if (c == '-'){
          exp = 0.1;
          s++;
      }else if (c == '+'){
          s++;
      }
  
      while ((c = *s++) != '\0'){
          if ((c &gt;= '0') &amp;&amp; (c &lt;= '9')){
              num = num*10 + c - '0';
          }
          else{
              return 0x01;
          }
      }
  
      double tmp = 0x01;
      while (num--){
          tmp *= exp;
      }
  
      return tmp;
  }
  
  double atof_beta(char *s)
  {
      double integer = 0x00;
      double fraction = 0x00;
      int sign = 0x01;
      int fraction_flag = 0x00;
      double divisor = 0x01;
      double exp = 0x01;
  
      char c = *s;
  
      if (c == '-'){
          sign = -1;
          s++;
      }else if (c == '+'){
          sign = 1;
          s++;
      }
  
      while ((c = (*s++)) != '\0'){
          if ((c &gt;= '0') &amp;&amp; (c &lt;= '9')){
              if (!fraction_flag){
                  integer = integer*10 + (c -'0');
              }else{
                  fraction = fraction*10 + c -'0';
                  divisor *= 10;
              }
          }else if (c == '.'){
              fraction_flag = 0x01;
          }else if ((c == 'e') || (c == 'E')){
              exp = get_exp(s);
              break;
          }else{
              break;
          }
      }
  
      integer = check_overflow(integer);
      fraction = check_overflow(fraction);
      exp = check_overflow(exp);
      double val = sign*((integer + (fraction/divisor))*exp);
      return check_overflow(val);
  }
  
  #define EPSILON 1e-6
  void main()
  {
      char s[1024], *p;
      double val;
  
      while(1)
      {
          printf("enter string : ");
          fgets(s, sizeof(s), stdin);
          if ((p = strchr(s, '\n')) != NULL) { 
              *p = '\0'; /* Remove newline */
          }
          puts(s); /* No need to cast */
          val = atof_beta(s);
          printf("\nfinal value : %lf, %lf, %d\n", val, atof(s), (fabs(val-atof(s)) &lt;= EPSILON));
      }
  
      return;
  }
  </code></pre>