📄 eicfftoa.c
字号:
/* eicfftoa.c * * (C) Copyright Dec 29 1995, Edmond J. Breen. * ALL RIGHTS RESERVED. * This code may be copied for personal, non-profit use only. * *//*#define DBL_MIN_EXP -100 */#include <math.h>#include <limits.h>#include <float.h>#include "stdliblocal.h"char *fftoa(double d, char *str, int p, char type, int trunc){ /* * Convert a floating-point number into a * formatted 'f','e' or 'E' type string. * (c) Edmond J.Breen, March 1995. * where: 'p' represents the precision * i.e. the number of digits * that will be placed after * the decimal point. * A precision of 0 suppresses * the decimal point. * 'type' is either 'f', 'e' or 'E'. * 'f' -> [-]mmm.dddd * 'e' -> [-]m.dddde+xx * | [-]m.dddde-xx * 'E' -> [-]m.ddddE+xx * | [-]m.ddddE-xx * 'trunc' if trunc != 0 then trailing * zeros will be removed. * i.e. 'g' or 'G' format. */ double M; int i, j, width, spt, dec, prec; static char *s; prec = p; i = 0; if (d < 0) str[0] = '-', s = &str[1], d = -d; else s = str; if (d >= 1) { /* collect integer part */ int k, c; double D = floor(d); d -= D; do { j = fmod(D,10.0); s[i++] = j + '0'; D -= j; } while ((D /= 10) >= 1); /* now reverse the string */ for (k = i, j = 0, k--; j < k; j++, k--) { c = s[j]; s[j] = s[k]; s[k] = c; } } dec = i; if (!dec) { /* check for numbers less than 1 */ if (type != 'f') { /* assume 'e' or 'E' format */ if (d != 0) { /* d == d might be a safety check? */ while ((d *= 10) < 1 && dec > DBL_MIN_EXP) --dec; --dec; } if (d >= 1) prec++, d /= 10; } else s[i++] = '0'; } if (dec < 0) width = prec; else if (type == 'f') width = prec + (dec > 0 ? dec : 1); else width = prec + 1; M = DBL_EPSILON/(FLT_RADIX*2.0); /* precision value */ while(1) { /* now collect fraction */ d *= 10; j = (int) d; d -= j; M *=10; if((i < width) && (d >= M && d <= (1-M))) s[i++] = (char) j + '0'; else break; } if(d>=0.5) j++; s[i++] = (char) j + '0'; while(i<=width) s[i++] = '0'; /* Have to round see ANSI176,13.9.5.2 */ if (!strround(s, width + 1)) /* watch for over flow */ s[0] = '1', width++, dec++; if (p != 0) { /* add in decimal point */ if (type == 'f') { if (dec > 0) spt = dec; else spt = 1; } else spt = 1; for (i = width; i > spt; i--) s[i] = s[i - 1]; s[spt] = '.'; } else width--; if (trunc) { /* remove trailing zeros */ while (width && s[width] == '0') width--; if (s[width] == '.') width--; } if (type != 'f') { /* add in exponent */ s[++width] = type; if (dec >= 0) { s[++width] = '+'; if (dec != 0) dec = dec - 1; if (dec < 10) s[++width] = '0'; } else if (dec < 0) { s[++width] = '-'; if (dec > -10) s[++width] = '0'; dec = -dec; } itoa(dec, &s[++width], 10); } else s[width + 1] = 0; return str;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -