unsigned int sp_svg_number_write_de (gchar *buf, double val, unsigned int tprec, unsigned int padf) { if ((val == 0.0) || ((fabs (val) >= 0.1) && (fabs(val) < 10000000))) { return sp_svg_number_write_d (buf, val, tprec, 0, padf); } else { double eval; int p; eval = floor (log10 (fabs (val))); val = val / pow (10.0, eval); p = sp_svg_number_write_d (buf, val, tprec, 0, padf); buf[p++] = 'e'; p += sp_svg_number_write_i (buf + p, (int) eval); return p; } }
unsigned int sp_svg_number_write_de(gchar *buf, int bufLen, double val, unsigned int tprec, int min_exp) { int eval = (int)floor(log10(fabs(val))); if (val == 0.0 || eval < min_exp) { return sp_svg_number_write_ui(buf, 0); } unsigned int maxnumdigitsWithoutExp = // This doesn't include the sign because it is included in either representation eval<0?tprec+(unsigned int)-eval+1: eval+1<(int)tprec?tprec+1: (unsigned int)eval+1; unsigned int maxnumdigitsWithExp = tprec + ( eval<0 ? 4 : 3 ); // It's not necessary to take larger exponents into account, because then maxnumdigitsWithoutExp is DEFINITELY larger if (maxnumdigitsWithoutExp <= maxnumdigitsWithExp) { return sp_svg_number_write_d(buf, bufLen, val, tprec, 0); } else { val = eval < 0 ? val * pow(10.0, -eval) : val / pow(10.0, eval); int p = sp_svg_number_write_d(buf, bufLen, val, tprec, 0); buf[p++] = 'e'; p += sp_svg_number_write_i(buf + p, bufLen - p, eval); return p; } }