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

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

Во. Сам не пробовал, но выглядит неплохо.

Отправлено 1111 12 февраля 2009 г. 13:53
В ответ на: Вывод информации на символьный ЖКИ отправлено пользователем anvik 12 февраля 2009 г. 12:04


<code>
// ==========================================================
// Преобразование числа в строковое представление. Возвращает указатель на конец занятого буфера
// ==========================================================
unsigned char *float_conversion(float value, // Преобразуемая величина
short nr_of_digits, // Общее количество цифр для представления числа
// Если число меньше 1, то не считая предварительных нулей
unsigned char *buf,
unsigned char format_flag, // 'E' или 'e'
unsigned char g_flag, // 1 - представлять в формате с фиксированной точкой
unsigned char alternate_flag) // 1 - не убирать не значащие нули
{
unsigned char *cp, *buf_pointer;
short n, i, dec_point_pos, integral_10_log;

buf_pointer = buf;
integral_10_log = 0;
// Показать знак числа
if (value<0)
{
value=-value;
*buf_pointer++ = '-';
}

if (value >= 1)
{
// Вычисляем количество десятков в экспоненте
while (value >= 1e11)
{
value /= 1e10;
integral_10_log += 10;
}
// Вычисляем количество единиц в экспоненте
while (value >= 10)
{
value /= 10;
integral_10_log++;
}
}
else if (value)
{
// Вычисляем количество десятков в знаменателе экспоненты
while (value <= 1e-10)
{
value *= 1e10;
integral_10_log -= 10;
}
// Вычисляем количество единиц в знаменателе экспоненты
while (value < 1)
{
value *= 10;
integral_10_log--;
}
}

if (g_flag)
{
if (integral_10_log < nr_of_digits && integral_10_log >= -4)
{
format_flag = 0;
nr_of_digits = nr_of_digits - integral_10_log;
}
nr_of_digits--;
if (alternate_flag)
{
g_flag = 0; /* %#G - No removal of trailing zeros */
}
else
{
alternate_flag = 1; /* %G - Removal of trailing zeros */
}
}

if (format_flag) /* %e or %E */
{
// Для представления с экспонентой
dec_point_pos = 0;
}
else
{
if (integral_10_log < 0)
{
// Для чисел меньших по абсолютному значению чем 1 в представлении без экспоненты
*buf_pointer++ = '0';
if ((n = nr_of_digits) || alternate_flag)
{
*buf_pointer++ = '.';
}
i = 0;
while (--i > integral_10_log && nr_of_digits)
{
*buf_pointer++ = '0';
nr_of_digits--;
}
if (integral_10_log < (-n - 1))
{
goto CLEAN_UP; /* Nothing more to do */
}
dec_point_pos = 1;
}
else
{
// Для чисел больших по абсолютному значению чем 1 в представлении без экспоненты
dec_point_pos = - integral_10_log;
}
}

i = dec_point_pos;
while (i <= nr_of_digits )
{
n = value;
value = value - n; /* n=Digit value=Remainder */
value = value * 10; /* Prepare for next shot */
*buf_pointer++ = n + '0';
if ( ! i++ && (nr_of_digits || alternate_flag))
{
*buf_pointer++ = '.';
}
} // while

if (value >= 5) /* Rounding possible */
{
n = 1; /* Carry */
cp = buf_pointer - 1;
do
{
if (*cp != '.')
if ( (*cp += n) == ('9' + 1) )
{
*cp = '0';
n = 1;
}
else
{
n = 0;
}
} while (cp-- > buf);
if (n)
{
if (format_flag) /* %e or %E */
{
cp = buf_pointer;
while (cp > buf)
{
if (*(cp - 1) == '.')
{
*cp = *(cp - 2);
cp--;
}
else
{
*cp = *(cp - 1);
}
cp--;
}
integral_10_log++;
}
else
{
cp = ++buf_pointer;
while (cp > buf)
{
*cp = *(cp - 1);
cp--;
}
}
*buf = '1';
}
}
CLEAN_UP:
if (g_flag) /* %G - Remove trailing zeros */
{
while (*(buf_pointer - 1) == '0')
{
buf_pointer--;
}
if (*(buf_pointer - 1) == '.')
{
buf_pointer--;
}
}
if (format_flag) /* %e or %E */
{
*buf_pointer++ = format_flag;
if (integral_10_log < 0)
{
*buf_pointer++ = '-';
integral_10_log = -integral_10_log;
}
else
{
*buf_pointer++ = '+';
}
n = 0;
buf_pointer +=3;
do
{
n++;
*buf_pointer++ = (integral_10_log % 10) + '0'; // Запись в буфер цифр экспоненты
integral_10_log /= 10;
} while ( integral_10_log || n < 2 );
for ( i = n ; n > 0 ; n-- )
*(buf_pointer - 4 - i + n) = *(buf_pointer - n);
buf_pointer -= 3;
}
*buf_pointer=0;
return buf_pointer;
}
</code>


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

Ответы


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

Сообщение:

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

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

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

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