Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:jobsmp@pochta.ru

Телесистемы | Электроника | Конференция «Микроконтроллеры и их применение»

Ответ: Вот вариант...

Отправлено lebiga (88.81.232.218) 12 июня 2012, г. 14:49
В ответ на: Посоветуйте библиотеку преобразования float в строку для dsPIC . стандартная библиотека . отжирает ппц памяти. отправлено av-master 12 июня 2012, г. 11:52

#pragma ot(3)
#include <math.h>
#pragma nosignedchar

#if PRIB
#pragma sp(2)
#endif

/*-------ПОДПРОГРАММА ФОРМАТНОГО ВЫВОДА НА ЭКРАН ЧИСЕЛ float---------*/
void prfl(char *p,double arg,char podaw0)
{
#if !PRIB
signed char MAXPREC=4,MAXDIG=6;
signed char NDIG=MAXDIG; /* NDIG==number of digits can be written */
signed char first_nonzero=0,decpt=0;
char *q,*r=p;
double fi,tmp_fi,fj;
double multiplier=1;

#else
register signed char MAXPREC=4,MAXDIG=6;
register signed char NDIG; /* NDIG==number of digits can be written */
register signed char first_nonzero=0,decpt=0;
register char *q,*r=p;
register double fi,tmp_fi,fj;
register double multiplier=1;
#endif

if (podaw0==2)
{ MAXPREC=2; MAXDIG=5; podaw0=0;}
else if (podaw0==4)
{ MAXPREC=3; MAXDIG=5; podaw0=0;}
else if (podaw0==3)
{ MAXPREC=7; MAXDIG=9; podaw0=0;}

NDIG=MAXDIG;
if (arg<0.0) {
arg=-arg;
NDIG--;
*r++='-';
decpt++;
}

arg=modf(arg,&fi);

if (fi!=0.0) { /* integer part present */
q=p+MAXDIG;
tmp_fi=fi;
while (fi!=0.0) {
if (decpt>=MAXDIG) { /* buffer is full */
r=p; *r++='?'; *r++='\0';
return;
}
fj=modf(fi*0.1,&fi);
if (!first_nonzero) {
multiplier*=10;
if ((char)((fj+0.03)*10)) {
first_nonzero=1;
fj=modf(tmp_fi/multiplier,&fi);
}
}
*--q=(char)((fj+0.03)*10)+'0';
decpt++;
NDIG--;
}
while (q<p+MAXDIG) /* move chars to the beginning */
*r++=*q++; /* integer part done */
} else {
*r++='0'; decpt++;
if (arg==0.0) { /* zero */
*r++='.';
for (decpt=0;decpt<MAXPREC;decpt++) /* decpt is used only as a counter here */
if(podaw0!=0) *r++=' ';
else *r++='0';
*r++='\0'; return;
}
} /* no integer part */

if (arg>0.0) { /* fractional part is present */
NDIG--; /* for a decimal point */
if (NDIG>MAXPREC) NDIG=MAXPREC;
if (NDIG<=-1) /* no place for fract. part */
NDIG++; /* however,we should round, as fract. part is present */
q=r+NDIG;
NDIG++;
for (;NDIG!=0;NDIG--) { /* move NDIG+1 chars to string */
arg*=10;
arg=modf(arg,&fi);
*r++=(char)fi+'0';
}
r=q; /* Rounding up, starting from the last read position */
*q+=5;
if (*q>'9') {/* Carry? */
while (*q>'9') { /* add carry to prev. digit */
if ((q>p)&&(*(q-1)!='-')) { /* not a leftmost digit */
*q='0';
*--q+=1;
} else { /* leftmost digit */
*q='1';
decpt++;
if (decpt>MAXDIG) { /* buffer overflow */
r=p; *r++='?'; *r++='\0';
return;
}
r++;
}
}
} /* fractional part done */
*r--='\0'; /* r points to the last char in string */
for (;r>=p+decpt && *r=='0';r--) { /* delete zeros in fract. part */
*r='\0';
if (r==p+decpt)
{ decpt=0; break; } /* point not needed (no fract. part) */
}
if (*r!='\0') r++; /* r points to '\0' */
} else { /* no fractional part */
decpt=0;
*r=0;
}
/* make a correct string; sign is already in it */
if (decpt==0) /* only integer part */
decpt=r-p; /* dec. point must be after the integer part */
q=r+MAXPREC;
if (q>=p+MAXDIG) q=p+MAXDIG-1;/* string must be not longer than a buffer */
for (;r<q;) /* fill the buffer up to q with 0's */
if(podaw0!=0) *r++=' ';
else *r++='0';
*r++='\0'; /* r points to the end of buffer */
q=r-1; /* add decimal point */
if (decpt>0 && decpt<=MAXDIG-1) {
for (;q>=p+decpt;)
*r--=*q--;
*r='.';
}
}


Составить ответ | Вернуться на конференцию

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
умножьте 2 на три:

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru