formatting without _floatp10

git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@5011 212acab6-be3b-0410-9dea-997c60f758d6
This commit is contained in:
kichik 2007-03-30 19:40:27 +00:00
parent 7b3240cd5c
commit b1545f5a6a

View file

@ -1,4 +1,5 @@
#include <windows.h>
#include <stdio.h>
#include "MyMath.h"
#include "Math.h"
@ -195,133 +196,12 @@ void itoa64(__int64 i, char *buffer)
*buffer = 0;
}
#define _FLOAT_ROUND_ADJUST (double)5e-15
extern "C"
int _ftol(double num);
int _floatp10(double *fnum, int *fsign, int prec)
{
int fpower, _d;
fcvt(*fnum, prec, &fpower, &_d);
if (*fnum < 0)
*fsign = -1;
else
*fsign = 1;
return fpower;
}
#define POS_INFINITY "#INF"
#define NEG_INFINITY "-#INF"
void FloatFormatF(char *s, double value, int prec)
{
int fpower, fsign, fdigit, fprec = 0, fzfill = 0;
fpower = _floatp10(&value, &fsign, prec);
if(fsign < 0) *s++ = '-';
if(fpower < 0)
{
*s++ = '0';
fpower++;
fzfill++;
} else {
while(fpower >= 0)
{
if(fprec < 16)
{
fdigit = (int)value;
*s++ = (char)((char)fdigit + (char)48);
value -= (double)fdigit;
value *= (double)10;
value += _FLOAT_ROUND_ADJUST;
fprec++;
} else {
*s++ = '0';
}
fpower--;
}
fpower = 0;
}
if(prec)
{
*s++ = '.';
while(prec)
{
if(fzfill && fpower < 0)
{
*s++ = '0';
fpower++;
} else {
if(fprec < 16)
{
fdigit = (int)value;
*s++ = (unsigned char)((unsigned char)fdigit +
(unsigned char)48);
value -= (double)fdigit;
value *= (double)10;
value += _FLOAT_ROUND_ADJUST;
fprec++;
} else {
*s++ = '0';
}
}
prec--;
}
}
*s = '\0';
}
void FloatFormatE(char *s, double fnum, int options)
{
int fpower, fsign, fdigit, fprec = 0, prec;
double sfnum;
prec = options & 0xF;
sfnum = fnum;
fpower = _floatp10(&sfnum, &fsign, -999);
fpower = _floatp10(&fnum, &fsign, prec - fpower);
if(fsign < 0) *s++ = '-';
fdigit = (int)fnum;
*s++ = (char)((char)fdigit + (char)48);
fnum -= (double)fdigit;
fnum *= (double)10;
fnum += _FLOAT_ROUND_ADJUST;
if(prec)
{
*s++ = '.';
while(prec)
{
if(fprec < 16)
{
fdigit = (int)fnum;
*s++ = (unsigned char)((unsigned char)fdigit +
(unsigned char)48);
fnum -= (double)fdigit;
fnum *= (double)10;
fnum += _FLOAT_ROUND_ADJUST;
fprec++;
} else *s++ = '0';
prec--;
}
}
*s++ = ((options & FF_LEXP)?('E'):('e'));
if(fpower >= 0)
{
*s++ = '+';
} else {
*s++ = '-';
fpower = -fpower;
}
if(fpower < 10) *s++ = '0';
itoa64(fpower, s);
}
void FloatFormat(char *s, double value, int options)
{
char format[128];
int prec = options & 0xF;
*s = 0;
@ -335,37 +215,24 @@ void FloatFormat(char *s, double value, int options)
return;
}
int decpt, sign;
char *res = fcvt(value, prec, &decpt, &sign);
if (res)
if (options & FF_NOEXP)
{
lstrcpyn(s, res, decpt + 1);
lstrcat(s, ".");
lstrcpy(s + decpt + 1, res + decpt);
sprintf(format, "%%.%df", prec);
}
else if (options & FF_EXP)
{
sprintf(format, "%%.%de", prec);
}
else if (options & FF_LEXP)
{
sprintf(format, "%%.%dE", prec);
}
else
{
sprintf(format, "%%.%dg", prec);
}
/*if (options & FF_NOEXP) FloatFormatF(s, value, prec);
else
if (options & FF_EXP) FloatFormatE(s, value, options);
else
{
double sfnum = value;
int fsign, fpower;
fpower = _floatp10(&sfnum, &fsign, -999);
sfnum = value;
fpower = _floatp10(&sfnum, &fsign, prec - fpower);
if((value != 0.0) && ((fpower < -4) || (fpower >= prec)))
FloatFormatE(s, value, options);
else
{
prec -= (fpower + 1);
if(prec <= 0) prec = 1;
FloatFormatF(s, value, prec);
}
}*/
sprintf(s, format, value);
}
int lstrcmpn(char *s1, const char *s2, int chars)