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_d (gchar *buf, double val, unsigned int tprec, unsigned int fprec, unsigned int padf) { double dival, fval; int idigits, ival, i; i = 0; /* Process sign */ if (val < 0.0) { buf[i++] = '-'; val = fabs (val); } /* Determine number of integral digits */ if (val >= 1.0) { idigits = (int) floor (log10 (val)); } else { idigits = 0; } /* Determine the actual number of fractional digits */ fprec = MAX (fprec, tprec - idigits); /* Round value */ val += 0.5 * pow (10.0, - ((double) fprec)); /* Extract integral and fractional parts */ dival = floor (val); ival = (int) dival; fval = val - dival; /* Write integra */ i += sp_svg_number_write_i (buf + i, ival); if ((fprec > 0) && (padf || (fval > 0.0))) { buf[i++] = '.'; while ((fprec > 0) && (padf || (fval > 0.0))) { fval *= 10.0; dival = floor (fval); fval -= dival; buf[i++] = '0' + (int) dival; fprec -= 1; } } buf[i] = 0; return i; }
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; } }