📄 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 + -