void __format_nan_or_inf(char * buf, double x, ios_base::fmtflags flags) { static const char* inf[2] = { "inf", "Inf" }; static const char* nan[2] = { "nan", "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]); }
inline bool _Stl_is_neg_inf(double x) { return _Stl_is_inf(x) && x < 0 ; }
// bool _Stl_is_neg_inf(double x) { return _class(x) == FP_MINUS_INF; } bool _Stl_is_neg_inf(double x) { return _Stl_is_inf(x) && ( copysign(1., x) < 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 */ }