Ejemplo n.º 1
0
static inline 
void __format_float(char * buf, const char * bp, 
                    int decpt, int sign, max_double_type x,
                    ios_base::fmtflags flags,
                    int precision, bool islong)
{
  // Output of infinities and NANs does not depend on the format flags
  if (_Stl_is_nan_or_inf((double)x)) {       // Infinity or NaN
    __format_nan_or_inf(buf, x, flags);
  } 
  else {                        // representable number
    switch (flags & ios_base::floatfield) {
    case ios_base::scientific:
      __format_float_scientific(buf, bp, decpt, sign, x == 0.0, flags,
                                precision, islong);
      break;
      
    case ios_base::fixed:
      __format_float_fixed(buf, bp, decpt, sign, true, flags,
                           precision, islong);
      break;
      
    default: // g format
      // establish default precision
      if (flags & ios_base::showpoint || precision > 0) {
        if (precision == 0) precision = 1;
      }
      else
        precision = 6;
      
      // reset exponent if value is zero
      if (x == 0)
        decpt = 1;
      
      int kk = precision;
      if (!(flags & ios_base::showpoint)) {
        size_t n = strlen(bp);
        if (n < kk)
          kk = (int)n;
        while (kk >= 1 && bp[kk-1] == '0')
          --kk;
      }
      
      if (decpt < -3 || decpt > precision) {
        precision = kk - 1;
        __format_float_scientific(buf, bp, decpt, sign, x == 0,
                                  flags, precision, islong);
      }
      else {
        precision = kk - decpt;
        __format_float_fixed(buf, bp, decpt, sign, true,
                             flags, precision, islong);
      }
      break;
    } /* switch */
  } /* else */
}
Ejemplo n.º 2
0
inline bool _Stl_is_inf(double x)        {   return _Stl_is_nan_or_inf(x) && ! isnan(x); }
Ejemplo n.º 3
0
void __format_float(char * buf, const char * bp, 
                    int decpt, int sign, max_double_type x,
                    ios_base::fmtflags flags,
                    int precision, bool islong)
{
  const char* inf[2] = { "inf", "INF" };
  const char* nan[2] = { "nan", "NAN" };

  // Output of infinities and NANs does not depend on the format flags
  if (_Stl_is_nan_or_inf((double)x)) {       // Infinity or NaN
    const char** inf_or_nan = 0;
    if (_Stl_is_inf((double)x)) {            // Infinity
      inf_or_nan = inf;
      if (_Stl_is_neg_inf((double)x))
        *buf++ = '-';
      else if (flags & ios_base::showpos)
        *buf++ = '+';
    }
    else {                      // NaN
      inf_or_nan = nan;
      if (_Stl_is_neg_nan((double)x))
        *buf++ = '-';
      else if (flags & ios_base::showpos)
        *buf++ = '+';
    }
    strcpy(buf, flags & ios_base::uppercase ? inf_or_nan[1] : inf_or_nan[0]);
  }
  else {                        // representable number
    switch (flags & ios_base::floatfield) {
      case ios_base::scientific:
        __format_float_scientific(buf, bp, decpt, sign, x, flags,
                                  precision, islong);
        break;
  
      case ios_base::fixed:
        __format_float_fixed(buf, bp, decpt, sign, x, flags,
                             precision, islong);
        break;
  
      default: // g format
        // establish default precision
        if (flags & ios_base::showpoint || precision > 0) {
          if (precision == 0) precision = 1;
        }
        else
          precision = 6;

        // reset exponent if value is zero
        if (x == 0)
          decpt = 1;

        int kk = precision;
        if (!(flags & ios_base::showpoint)) {
          int n = strlen(bp);
          if (n < kk)
          kk = n;
          while (kk >= 1 && bp[kk-1] == '0')
            --kk;
        }

        if (decpt < -3 || decpt > precision) {
          precision = kk - 1;
          __format_float_scientific(buf, bp, decpt, sign, x,
                                    flags, precision, islong);
        }
        else {
          precision = kk - decpt;
          __format_float_fixed(buf, bp, decpt, sign, x,
                               flags, precision, islong);
        }
      break;
    } /* switch */
  } /* else */
}