я вот такой бодягой пользуюсь...
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено diper 26 августа 2003 г. 13:44
В ответ на: Нужна функция преобразования (float to string). В Кейле не нашёл. Подскажите, где взять. отправлено Alkur 26 августа 2003 г. 12:48


/******************************************************************************
**
** 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