|
/******************************************************************************
**
** Function: uchar* FloatToString(float f, uchar *ptr, uchar prec)
**
** Description: Ввод числа в поле шириной 8, с учетом знака и округления
**
** Inputs : число, указатель цели, точность
**
** Outputs: указатель цели(тот же что и на входе)
**
** Comments: Округление для отрицательных происходит вниз
**
*******************************************************************************/
uchar* FloatToString(float f, uchar *ptr, uchar prec){
const uchar overFlow[8]={'O','v','e','r','f','l','o','w'};
uchar array[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
uchar i, j, intNum, floatNum, neg;
uchar *ptrTmp;
float fOld;ptrTmp=ptr;
//Отбрасываем лажовые числа (NAN,+INF,-INF)
if(((*(long*)(&f)) & 0x7F800000) == 0x7F800000){
memcpy(ptr,overFlow,8);
return ptrTmp;
}//Запоминаем знак, далее работаем с модулем,
// поэтому специфичное округления отрицательных чисел!!!
if(f<0.0){
f=-f;
neg=1;
}else
neg=0;//Отрезаем превышения
if((f >= (float)1e8)|| (f >= (float)1e7&&neg)){
memcpy(ptr,overFlow,8);
return ptrTmp;
}fOld=f;
//Режим число на цифры
for(i = 0; i < 16; i++){
array[i]=f/10000000.;
f=(f-(float)array[i]*10000000.)*10.;
}//Если 8 цифр, то сразу выводим
if(fOld >= (float)1e7|| (fOld >= (float)1e6&&neg)){
intNum=8-neg;
goto l_dataOut;
}//Считаем количество целых цифр.
i=0;
while(i<8&&array[i]==0){
intNum=7-i;
i++;
}//Количество знаков после запятой
floatNum = ((7 - neg - intNum) < prec) ? (7 - neg - intNum) : prec;//Округляем
array[8+floatNum] += 5;
for(i = 8+floatNum; i>0; i--)
if(array[i] > 9){
array[i] -= 10;
array[i-1]++;
}//Опять считаем количество целых цифр, тк при округлении оно могло измениться
i=0;
while(i<8&&array[i]==0){
intNum=7-i;
i++;
}//Всегда выводим 0.xxxxx, если число меньше 1
if(intNum == 0) intNum=1;l_dataOut:
//Выводим знак минус если отрицательное
if(neg)
*(ptr++) = '-';
//Выводим целую часть
for(i = 0; i < intNum; i++){
*(ptr++) = array[8-intNum+i] + '0';
}
//Выводим точку
if((i<8-neg) && prec !=0){
*(ptr++) = '.';
i++;
}
//Выводим дробную часть
for(j = 0; (i<8-neg) && j*(ptr++) = array[8+j]+'0';
}
// *ptr=0;
return ptrTmp;
}
E-mail: info@telesys.ru