Форум Микро-Чип
Поиск и заказ электронных компонентов
 

Вернуться   Форум Микро-Чип > Своими руками

Своими руками Завершенные и текущие проекты, хард & софт

Ответ
 
Опции темы Опции просмотра
Старый 09.05.2016, 23:10   #51
Vlad&mir
Senior Member
 
Регистрация: 28.01.2009
Адрес: Москва
Сообщений: 1,720
Вес репутации: 4345/92
Vlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond repute
По умолчанию Re: Делюсь программой преобразования float в массив для вывода, например, на LCD

Цитата:
Сообщение от Zloj_ya Посмотреть сообщение
Вот я тупой! Я ж это знал! Щас прогоню. Тактовую в симуляторе выставлю 20 МГц.
О, получилось следующее: Instruction Cycles - 3421, Time - 684,2 mkSecs.
Я довёл этот "примитив" до логического конца!
Код:
unsigned char float_to_asci(float value, unsigned char fractal, char * buff)
{
  unsigned long step[] = {1, 10, 100,  1000, 10000, 100000, 10000000, 100000000, 1000000000};
  float         mul[]  = {1.0, 10.0, 100.0,  1000.0};

  unsigned long temp, longvalue;
  unsigned char i, j, flag, atemp;

    flag = 0;

    if(value < 0.0)
     {
          value = -value;
        * buff++ = '-';
          j      =  1;
     }
     else  j =  0;

    if(fractal > 3) fractal = 0;

    if(fractal) value *= mul[fractal];

    longvalue = (unsigned long) value;

    for (i = 8; i < 9; i--)
     {
        temp  = step[i];

        atemp = '0';

        while(longvalue >= temp)
         {
            atemp++;

            longvalue -= temp;
         }

        if(flag || (atemp > '0') || (i == fractal))
         {
            * buff++ = atemp;
              flag   = 1;
              j++;
         }

        if(i == fractal)
         {
            * buff++ = '.';
              j++;
         }
     }

    * buff = 0; 

    return j;
}
где: value - число типа float, fractal - желаемое кол. знаков после запятой, buff - куда всё это выгрузить.

Функция возвращает количество символов в выходной строке без завершающего нуля.

float_to_asci(-1234.56, 2, & Buff[0]); // 2085 Cycles, Program memory 805

Последний раз редактировалось Vlad&mir; 09.05.2016 в 23:19.
Vlad&mir вне форума   Ответить с цитированием
Старый 10.05.2016, 08:52   #52
Pridnya
Senior Member
 
Регистрация: 21.01.2009
Адрес: Orel
Возраст: 38
Сообщений: 4,418
Вес репутации: 4322/119
Pridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond repute
По умолчанию Re: Делюсь программой преобразования float в массив для вывода, например, на LCD

Цитата:
Сообщение от Vlad&mir Посмотреть сообщение
Я довёл этот "примитив" до логического конца!...где: value - число типа float, fractal - желаемое кол. знаков после запятой, buff - куда всё это выгрузить.

Доверяй, но проверяй. Код тестировался в NetBeans, компилятор MinGW.
Код:
float fValue = 123.456789F;
float_to_asci(fValue, 1, Buffer);
cout<<Buffer<<endl; // 123.4
float_to_asci(fValue, 2, Buffer);
cout<<Buffer<<endl; // 123.45
float_to_asci(fValue, 3, Buffer);
cout<<Buffer<<endl; // 123.456
float_to_asci(fValue, 4, Buffer);
cout<<Buffer<<endl; // 123.
float_to_asci(fValue, 5, Buffer);
cout<<Buffer<<endl; // 123.
float_to_asci(fValue, 6, Buffer);
cout<<Buffer<<endl; // 123.
__________________
Прогресс неизбежен.
Pridnya вне форума   Ответить с цитированием
Старый 10.05.2016, 09:11   #53
Greg
Super Moderator
 
Регистрация: 25.02.2007
Адрес: Moscow, ODBS
Сообщений: 6,578
Вес репутации: 5056/154
Greg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond repute
По умолчанию Re: Делюсь программой преобразования float в массив для вывода, например, на LCD

Цитата:
Сообщение от HHIMERA Посмотреть сообщение
То ли ИАР окончательно нюх потерял... то ли аккумуляторная архитектура ему не по зубам... Может когда и допилят... но всё это как-то напрягает...
да, кстати, тоже был неприятно удивлен невысоким качеством кода. да и процессор как-то без изюминки.
хотя может так и надо - нормальная рабочая лошадь типа старых 51 (с 12 клоками на инструкцию).
Greg вне форума   Ответить с цитированием
Старый 10.05.2016, 09:26   #54
Greg
Super Moderator
 
Регистрация: 25.02.2007
Адрес: Moscow, ODBS
Сообщений: 6,578
Вес репутации: 5056/154
Greg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond repute
По умолчанию Re: Делюсь программой преобразования float в массив для вывода, например, на LCD

Цитата:
Сообщение от Vlad&mir Посмотреть сообщение
// 2085 Cycles, Program memory 805
ну вот, и чем это отличается от sprintf.
Greg вне форума   Ответить с цитированием
Старый 10.05.2016, 09:32   #55
Pridnya
Senior Member
 
Регистрация: 21.01.2009
Адрес: Orel
Возраст: 38
Сообщений: 4,418
Вес репутации: 4322/119
Pridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond repute
По умолчанию Re: Делюсь программой преобразования float в массив для вывода, например, на LCD

Цитата:
Сообщение от Greg Посмотреть сообщение
ну вот, и чем это отличается от sprintf.
Тем, что этот жадный алгоритм после доведения "до логического конца" стал еще и глючным. Кроме того, нет функций склейки строк, типа "Ia = 12.345 А", т.е. это нельзя записать в одной строке. И после потраченного времени мы получим стандартную функцию или хуже, но зато можно на переписывании заработать.

Цитата:
Сообщение от Pridnya Посмотреть сообщение
Код тестировался в NetBeans, компилятор MinGW.
Симулятор Keil для STM32F100 дает аналогичный результат
Код:
float fValue = 123.456789F;
float_to_asci(fValue, 1, Buffer);  // 123.4
float_to_asci(fValue, 2, Buffer);  // 123.45
float_to_asci(fValue, 3, Buffer);  // 123.456
float_to_asci(fValue, 4, Buffer);  // 123.
float_to_asci(fValue, 5, Buffer);  // 123.
float_to_asci(fValue, 6, Buffer);  // 123.
PS: Нужно подождать пару дней пока какой-нибудь Кардан Фрилансерович выдаст высокооптимизированный алгоритм для STM32F0. С использованием DMA.

PPS: Понятно, что в программе есть строка
Код:
 if(fractal > 3) fractal = 0;
А если будет 6, то сколько будет выполняться?
__________________
Прогресс неизбежен.

Последний раз редактировалось Pridnya; 10.05.2016 в 09:51.
Pridnya вне форума   Ответить с цитированием
Старый 10.05.2016, 09:56   #56
Pridnya
Senior Member
 
Регистрация: 21.01.2009
Адрес: Orel
Возраст: 38
Сообщений: 4,418
Вес репутации: 4322/119
Pridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond repute
По умолчанию Re: Делюсь программой преобразования float в массив для вывода, например, на LCD

Цитата:
Сообщение от Pridnya Посмотреть сообщение
PPS: Понятно, что в программе есть строка
Код:
 if(fractal > 3) fractal = 0;
Если её закомментировать, то получаем
Код:
float fValue = 123.456789F;
float_to_asci(fValue, 1, Buffer);
cout<<Buffer<<endl; // 123.4
float_to_asci(fValue, 2, Buffer);
cout<<Buffer<<endl; // 123.45
float_to_asci(fValue, 3, Buffer);
cout<<Buffer<<endl; // 123.456
float_to_asci(fValue, 4, Buffer);
cout<<Buffer<<endl; // 0.0000
float_to_asci(fValue, 5, Buffer);
cout<<Buffer<<endl; // 0.00000
float_to_asci(fValue, 6, Buffer);
cout<<Buffer<<endl; // 0.000000
А для чисел побольше получим ошибки
Код:
float fValue = 12345.6789F;
float_to_asci(fValue, 1, Buffer);
cout<<Buffer<<endl; // 12345.6
float_to_asci(fValue, 2, Buffer);
cout<<Buffer<<endl; // <345.67
float_to_asci(fValue, 3, Buffer);
cout<<Buffer<<endl; // 1G45.679
float_to_asci(fValue, 4, Buffer);
cout<<Buffer<<endl; // 0.0000
float_to_asci(fValue, 5, Buffer);
cout<<Buffer<<endl; // 0.00000
float_to_asci(fValue, 6, Buffer);
cout<<Buffer<<endl; // 0.000000
__________________
Прогресс неизбежен.
Pridnya вне форума   Ответить с цитированием
Старый 10.05.2016, 10:18   #57
Vlad&mir
Senior Member
 
Регистрация: 28.01.2009
Адрес: Москва
Сообщений: 1,720
Вес репутации: 4345/92
Vlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond repute
По умолчанию Re: Делюсь программой преобразования float в массив для вывода, например, на LCD

Шёл бы, ты, Дима... картошку сажать!
Vlad&mir вне форума   Ответить с цитированием
Старый 10.05.2016, 10:20   #58
Pridnya
Senior Member
 
Регистрация: 21.01.2009
Адрес: Orel
Возраст: 38
Сообщений: 4,418
Вес репутации: 4322/119
Pridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond repute
По умолчанию Re: Делюсь программой преобразования float в массив для вывода, например, на LCD

Цитата:
Сообщение от Vlad&mir Посмотреть сообщение
Шёл бы, ты, Дима... картошку сажать!
Так в субботу вспахали огород, в воскресенье уже посадили картошку (5 сеток по 4 ведра ). Механизация труда, научный подход, плюс знание тонкостей сельской жизни (срочность нужно учитывать, а то с работы отпрашиваться будешь...себе дороже выйдет...). И посадили руками 300 луковиц (красного и белого), вчера отдыхал, сегодня работаю.
__________________
Прогресс неизбежен.
Pridnya вне форума   Ответить с цитированием
Старый 10.05.2016, 10:23   #59
HHIMERA
Senior Member
 
Регистрация: 10.06.2008
Возраст: 55
Сообщений: 2,664
Вес репутации: 3694/96
HHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond repute
По умолчанию Re: Делюсь программой преобразования float в массив для вывода, например, на LCD

Цитата:
Сообщение от Greg Посмотреть сообщение
да, кстати, тоже был неприятно удивлен невысоким качеством кода.
Та да... Понимаю... что аккумулятор не даёт особо развернуться... но там и элементарных косяков хватало... приходилось всё время контролировать выходной код и подпирать его костылями... что неимоверно раздражает... особенно при наличии копеечных СТМ32Ф0...
Цитата:
да и процессор как-то без изюминки.
Почему... изюминки там есть... и в ядре... и в периферии... в своём классе... А вот с компилями... ну просто беда...
Цитата:
хотя может так и надо - нормальная рабочая лошадь типа старых 51 (с 12 клоками на инструкцию).
Какое-то стойкое ощущение... что СТМ держит СТМ8 на остаточном принципе... чтобы было... Хотя... компилерописатели и ПИКи не особо то жаловали...
__________________
"Я не даю готовых решений, я заставляю думать!"(С)
HHIMERA вне форума   Ответить с цитированием
Старый 10.05.2016, 10:28   #60
HHIMERA
Senior Member
 
Регистрация: 10.06.2008
Возраст: 55
Сообщений: 2,664
Вес репутации: 3694/96
HHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond repute
По умолчанию Re: Делюсь программой преобразования float в массив для вывода, например, на LCD

Цитата:
Сообщение от Pridnya Посмотреть сообщение
Так в субботу вспахали огород, в воскресенье уже посадили картошку (5 сеток по 4 ведра ).
Не тормози!!! Тебе до осени... ещё сажать и сажать... сколько там выходных... Потом до весны... выкапывать...
__________________
"Я не даю готовых решений, я заставляю думать!"(С)
HHIMERA вне форума   Ответить с цитированием
Старый 10.05.2016, 10:30   #61
Vlad&mir
Senior Member
 
Регистрация: 28.01.2009
Адрес: Москва
Сообщений: 1,720
Вес репутации: 4345/92
Vlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond repute
По умолчанию Re: Делюсь программой преобразования float в массив для вывода, например, на LCD

Цитата:
Сообщение от Pridnya Посмотреть сообщение
Так в субботу вспахали огород, в воскресенье уже посадили картошку (5 сеток по 4 ведра ). Механизация труда, научный подход, плюс знание тонкостей сельской жизни (срочность нужно учитывать, а то с работы отпрашиваться будешь...себе дороже выйдет...). И посадили руками 300 луковиц (красного и белого), вчера отдыхал, сегодня работаю.
Ну вот, это замечательно, а то распереживался за printf.
А на работе освежи в памяти формат float, в частности уточни сколько там значащих цифр. А то пишешь не думая: float fValue = 12345.6789F и ещё планируешь извлечь оттуда 6-й знак после запятой.
.
Vlad&mir вне форума   Ответить с цитированием
Старый 10.05.2016, 10:42   #62
Pridnya
Senior Member
 
Регистрация: 21.01.2009
Адрес: Orel
Возраст: 38
Сообщений: 4,418
Вес репутации: 4322/119
Pridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond repute
По умолчанию Re: Делюсь программой преобразования float в массив для вывода, например, на LCD

Цитата:
Сообщение от Vlad&mir Посмотреть сообщение
Ну вот, это замечательно, а то распереживался за printf.
А на работе освежи в памяти формат float, в частности уточни сколько там значащих цифр. А то пишешь не думая: float fValue = 12345.6789F и ещё планируешь извлечь оттуда 6-й знак после запятой.
.
Сравниваем результат: ваша функция, затем MinGW (NetBeans), затем ARMCC (симулятор Keil).
Код:
float fValue = 12345.6789F;
float_to_asci(fValue, 1, Buffer);
cout<<Buffer<<endl; // 12345.6
float_to_asci(fValue, 2, Buffer);
cout<<Buffer<<endl; // <345.67
float_to_asci(fValue, 3, Buffer);
cout<<Buffer<<endl; // 1G45.679
float_to_asci(fValue, 4, Buffer);
cout<<Buffer<<endl; // 0.0000
float_to_asci(fValue, 5, Buffer);
cout<<Buffer<<endl; // 0.00000
float_to_asci(fValue, 6, Buffer);
cout<<Buffer<<endl; // 0.000000

float fValue = 12345.6789F;
sprintf(Buffer, "%.1f",fValue);
cout<<Buffer<<endl; // 12345.7
sprintf(Buffer, "%.2f",fValue);
cout<<Buffer<<endl; // 12345.68
sprintf(Buffer, "%.3f",fValue);
cout<<Buffer<<endl; // 12345.679
sprintf(Buffer, "%.4f",fValue);
cout<<Buffer<<endl; // 12345.6787
sprintf(Buffer, "%.5f",fValue);
cout<<Buffer<<endl; // 12345.67871
sprintf(Buffer, "%.6f",fValue);
cout<<Buffer<<endl; // 12345.678711

float fValue = 12345.6789F;
sprintf(Buffer, "%.1f",fValue);
printf("%s\n", Buffer);          // 12345.7
sprintf(Buffer, "%.2f",fValue);
printf("%s\n", Buffer);          // 12345.68
sprintf(Buffer, "%.3f",fValue);
printf("%s\n", Buffer);          // 12345.679
sprintf(Buffer, "%.4f",fValue);
printf("%s\n", Buffer);          // 12345.6787
sprintf(Buffer, "%.5f",fValue);
printf("%s\n", Buffer);          // 12345.67871
sprintf(Buffer, "%.6f",fValue);
printf("%s\n", Buffer);          // 12345.678711
__________________
Прогресс неизбежен.
Pridnya вне форума   Ответить с цитированием
Старый 10.05.2016, 10:58   #63
Pridnya
Senior Member
 
Регистрация: 21.01.2009
Адрес: Orel
Возраст: 38
Сообщений: 4,418
Вес репутации: 4322/119
Pridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond repute
По умолчанию Re: Делюсь программой преобразования float в массив для вывода, например, на LCD

Цитата:
Сообщение от Vlad&mir Посмотреть сообщение
Ну вот, это замечательно, а то распереживался за printf.
А на работе освежи в памяти формат float, в частности уточни сколько там значащих цифр. А то пишешь не думая: float fValue = 12345.6789F и ещё планируешь извлечь оттуда 6-й знак после запятой.
.
Так и извлекает (шестой), да и седьмой тоже виден. Результат для MinGW и ARMCC аналогичный.
Код:
float fValue = 1.23456789F;
sprintf(Buffer, "%.1f",fValue);
cout<<Buffer<<endl; // 1.2
sprintf(Buffer, "%.2f",fValue);
cout<<Buffer<<endl; // 1.23
sprintf(Buffer, "%.3f",fValue);
cout<<Buffer<<endl; // 1.234
sprintf(Buffer, "%.4f",fValue);
cout<<Buffer<<endl; // 1.2346
sprintf(Buffer, "%.5f",fValue);
cout<<Buffer<<endl; // 1.23457
sprintf(Buffer, "%.6f",fValue);
cout<<Buffer<<endl; // 1.234568
sprintf(Buffer, "%.7f",fValue);
cout<<Buffer<<endl; // 1.2345679
sprintf(Buffer, "%.8f",fValue);
cout<<Buffer<<endl; // 1.23456788
Миниатюры
float.PNG  
__________________
Прогресс неизбежен.
Pridnya вне форума   Ответить с цитированием
Старый 10.05.2016, 17:55   #64
HHIMERA
Senior Member
 
Регистрация: 10.06.2008
Возраст: 55
Сообщений: 2,664
Вес репутации: 3694/96
HHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond repute
По умолчанию

Цитата:
Сообщение от Pridnya Посмотреть сообщение
Так и извлекает (шестой), да и седьмой тоже виден. Результат для MinGW и ARMCC аналогичный.
Ну всё... урожайность картохи обеспечена...

Тоже отмечусь... впишу несколько цифр...
ИАР...СТМ8... просто что под руку попалось... ftoa() прога из ссылки... чуть подшаманенная... в плане размерностей... без изменений самого кода...

======
sprintf (Ress, "%.3f", 1.23456789f);
13521 циклов
результат 1.235

float_to_asci(1.23456789f, 3, Ress);
1364 циклов
результат 1.234

ftoa(1.23456789f, res, 3);
1558 циклов
результат 1.234

======
sprintf (Ress, "%.6f", 1.23456789f);
14085 циклов
результат 1.234568

float_to_asci(1.23456789f, 6, Ress);
--- ---
ограничения по коду

ftoa(1.23456789f, res, 6);
3298 циклов
результат 1.234567

======
sprintf (Ress, "%.8f", 1.23456789f);
14614 циклов
результат 1.23456790

float_to_asci(1.23456789f, 8, Ress);
--- ---
ограничения по коду

ftoa(1.23456789f, res, 8);
6091 циклов
результат 1.23456788
__________________
"Я не даю готовых решений, я заставляю думать!"(С)
HHIMERA вне форума   Ответить с цитированием
Старый 10.05.2016, 18:36   #65
Zloj_ya
Senior Member
 
Регистрация: 29.03.2007
Сообщений: 146
Вес репутации: 100/40
Zloj_ya will become famous soon enoughZloj_ya will become famous soon enough
По умолчанию Re: Делюсь программой преобразования float в массив для вывода, например, на LCD

Цитата:
Сообщение от Vlad&mir Посмотреть сообщение
Я довёл этот "примитив" до логического конца!
Код:
unsigned char float_to_asci(float value, unsigned char fractal, char * buff)
{
  unsigned long step[] = {1, 10, 100,  1000, 10000, 100000, 10000000, 100000000, 1000000000};
  float         mul[]  = {1.0, 10.0, 100.0,  1000.0};

  ........
}
где: value - число типа float, fractal - желаемое кол. знаков после запятой, buff - куда всё это выгрузить.

Функция возвращает количество символов в выходной строке без завершающего нуля.

float_to_asci(-1234.56, 2, & Buff[0]); // 2085 Cycles, Program memory 805
Честь Вам и хвала!
Не смею давать оценки и советы, но, ИМХО, не мешало бы для непосвященных пользователей, хоть какие-нить комментарии в строках кода ....
Да, а знак минус прога вставляет в буфер? И в каком виде?
Zloj_ya вне форума   Ответить с цитированием
Старый 10.05.2016, 20:34   #66
Greg
Super Moderator
 
Регистрация: 25.02.2007
Адрес: Moscow, ODBS
Сообщений: 6,578
Вес репутации: 5056/154
Greg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond repute
По умолчанию Re: Делюсь программой преобразования float в массив для вывода, например, на LCD

Цитата:
Сообщение от Pridnya Посмотреть сообщение
Так в субботу вспахали огород, в воскресенье уже посадили картошку (5 сеток по 4 ведра ).
- а во вторник уже собрали.
- вот это да! ну у вас и климат!
- да нет, осень кусать хосется...
(из анекдота про китайцев)
Greg вне форума   Ответить с цитированием
Старый 10.05.2016, 21:43   #67
Vlad&mir
Senior Member
 
Регистрация: 28.01.2009
Адрес: Москва
Сообщений: 1,720
Вес репутации: 4345/92
Vlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond repute
По умолчанию Re: Делюсь программой преобразования float в массив для вывода, например, на LCD

Цитата:
Сообщение от Pridnya Посмотреть сообщение
Так и извлекает (шестой), да и седьмой тоже...
Дима! ваши замечания устранены. Расширил fractal до 9, добавил проверку разрядности!
Код:
unsigned char float_to_asci(float value, unsigned char fractal, char * buff)
{
  unsigned long step[] = {1, 10, 100,  1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000};

  unsigned long temp, longvalue;
  unsigned char i, j, flag, atemp;

    if(value < 0.0)
     {
          value  = -value;
        * buff++ = '-';
          j      =  1;
     }
     else  j =  0;

    if(fractal < 10) value *= (float) step[fractal];

    if((value < 2147483647.0) && (fractal < 10))
     {
        flag = 0;
        longvalue = (unsigned long) value;

        for (i = 9; i < 0xFF; i--)
         {
            temp  = step[i];
            atemp = '0';

            while(longvalue >= temp)
             {
                atemp++;
                longvalue -= temp;
             }
    
            if(flag || (atemp > '0') || (i == fractal))
            {
                * buff++ = atemp;
                  flag   = 1;
                  j++;
             }

            if(i == fractal)
             {
                * buff++ = '.';
                  j++;
             }
         }
     }
     else
      {
        * buff++ = '*';
        * buff++ = '.';
          j += 2;

        for (i = 0; i < fractal; i++)
         {
            * buff++ = '*';
              j++;
         }
      }

    * buff = 0; 

    return j;
}
"Монстр" становится всё сложнее и сложнее!

Последний раз редактировалось Vlad&mir; 10.05.2016 в 21:50.
Vlad&mir вне форума   Ответить с цитированием
Старый 10.05.2016, 21:49   #68
Vlad&mir
Senior Member
 
Регистрация: 28.01.2009
Адрес: Москва
Сообщений: 1,720
Вес репутации: 4345/92
Vlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond repute
По умолчанию Re: Делюсь программой преобразования float в массив для вывода, например, на LCD

Цитата:
Сообщение от Zloj_ya Посмотреть сообщение
...Не смею давать оценки и советы, но, ИМХО, не мешало бы для непосвященных пользователей, хоть какие-нить комментарии в строках кода ....
Да, а знак минус прога вставляет в буфер? И в каком виде?
Я даже не знаю, что тут комментировать. Функция очень проста, код весьма прозрачен. Включите хоть немного мозг.
Знак минус "прога", естественно, в буфер вставляет, вот тут:
Код:
  if(value < 0.0)
     {
          value  = -value;
        * buff++ = '-';
          j      =  1;
     }
     else  j =  0;
j - это счётчик выводимых символов.
Vlad&mir вне форума   Ответить с цитированием
Старый 10.05.2016, 21:50   #69
Pridnya
Senior Member
 
Регистрация: 21.01.2009
Адрес: Orel
Возраст: 38
Сообщений: 4,418
Вес репутации: 4322/119
Pridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond repute
По умолчанию Re: Делюсь программой преобразования float в массив для вывода, например, на LCD

Цитата:
Сообщение от Greg Посмотреть сообщение
- а во вторник уже собрали.
- вот это да! ну у вас и климат!
- да нет, осень кусать хосется...
(из анекдота про китайцев)
Я сажаю не потому, что очень кушать хочется и есть нечего. Не могу ответить точно, сам не знаю, сажаю и все, пусть говорят "да за эти деньги можно осенью тонну отборной купить и весь год ничего не делать...". Зато земля в деревне не пустует, весной и осенью пашется, летом засеяна, приятно посмотреть и приятно свое кушать, точно знаю, какие сорта, как росла, сколько раз и когда обрабатывалась от жуков. Осенью могу раздать родственникам и соседям, весной могу выбросить излишки (вот и сейчас 8 мешков осталось), продавать не буду...очень дорогая она. Продовольственная безопасность в рамках одной семьи. И у меня еще сад, грядки...много чего своего. Вот такие мы чёкнутые.
Цитата:
Сообщение от Vlad&mir Посмотреть сообщение
Дима! ваши замечания устранены. Расширил fractal до 9, добавил проверку разрядности!
Код:
unsigned char float_to_asci(float value, unsigned char fractal, char * buff)
...
Это хорошо. Я к тому клонил, что sprintf() большая универсальная функция, а другие как бы аналогичные, дают результат для конкретных диапазонов и типов данных...И вообще я не против, если тщательно протестированная функция будет работать быстрее и занимать меньше места чем тот же sprintf(), т.е. для тех же float. Это же хорошо, проделана большая полезная работа.
__________________
Прогресс неизбежен.

Последний раз редактировалось Pridnya; 10.05.2016 в 21:56.
Pridnya вне форума   Ответить с цитированием
Старый 10.05.2016, 21:59   #70
Vlad&mir
Senior Member
 
Регистрация: 28.01.2009
Адрес: Москва
Сообщений: 1,720
Вес репутации: 4345/92
Vlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond repute
По умолчанию Re: Делюсь программой преобразования float в массив для вывода, например, на LCD

Цитата:
Сообщение от Pridnya Посмотреть сообщение
...Я к тому клонил, что sprintf() большая универсальная функция, а другие как бы аналогичные, дают результат для конкретных диапазонов и типов данных...И вообще я не против, если тщательно протестированная функция будет работать быстрее и занимать меньше места чем тот же sprintf(), т.е. для тех же float. Это же хорошо, проделана большая полезная работа.
Дима! Вот, оказывается, сам всё понимаешь, только народу мозги еб..шь!
Vlad&mir вне форума   Ответить с цитированием
Старый 10.05.2016, 22:32   #71
Pridnya
Senior Member
 
Регистрация: 21.01.2009
Адрес: Orel
Возраст: 38
Сообщений: 4,418
Вес репутации: 4322/119
Pridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond repute
По умолчанию Re: Делюсь программой преобразования float в массив для вывода, например, на LCD

Цитата:
Сообщение от Vlad&mir Посмотреть сообщение
Дима! Вот, оказывается, сам всё понимаешь, только народу мозги еб..шь!
Зато спустя сутки "логический конец" стал значительно лучше. Теперь все могут воспользоваться при необходимости. Функция корректно работает, никаких кракозябр вместо цифр. Проверял на -1.2345678F, 0.0F, 1.2345678F, -1234.5678F, 1234.5678F. Приятно видеть хороший результат.
__________________
Прогресс неизбежен.
Pridnya вне форума   Ответить с цитированием
Старый 10.05.2016, 22:35   #72
Zloj_ya
Senior Member
 
Регистрация: 29.03.2007
Сообщений: 146
Вес репутации: 100/40
Zloj_ya will become famous soon enoughZloj_ya will become famous soon enough
По умолчанию Re: Делюсь программой преобразования float в массив для вывода, например, на LCD

Цитата:
Сообщение от Vlad&mir Посмотреть сообщение
Я даже не знаю, что тут комментировать. Функция очень проста, код весьма прозрачен. Включите хоть немного мозг.....
Да мне-то все понятно. Я ж не для себя просил.
Есть ведь начинающие, или не в таком уж совершенстве владеющие Си. Их что, просто бартануть?
Zloj_ya вне форума   Ответить с цитированием
Старый 10.05.2016, 23:00   #73
Vlad&mir
Senior Member
 
Регистрация: 28.01.2009
Адрес: Москва
Сообщений: 1,720
Вес репутации: 4345/92
Vlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond repute
По умолчанию Re: Делюсь программой преобразования float в массив для вывода, например, на LCD

Цитата:
Сообщение от Pridnya Посмотреть сообщение
Зато спустя сутки "логический конец" стал значительно лучше. Теперь все могут воспользоваться при необходимости. Функция корректно работает, никаких кракозябр вместо цифр. Проверял на -1.2345678F, 0.0F, 1.2345678F, -1234.5678F, 1234.5678F. Приятно видеть хороший результат.
Спасибо кэп!
Vlad&mir вне форума   Ответить с цитированием
Старый 11.05.2016, 07:26   #74
Greg
Super Moderator
 
Регистрация: 25.02.2007
Адрес: Moscow, ODBS
Сообщений: 6,578
Вес репутации: 5056/154
Greg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond repute
По умолчанию Re: Делюсь программой преобразования float в массив для вывода, например, на LCD

Цитата:
Сообщение от Pridnya Посмотреть сообщение
Осенью могу раздать родственникам и соседям, весной могу выбросить излишки (вот и сейчас 8 мешков осталось), продавать не буду...очень дорогая она. Продовольственная безопасность в рамках одной семьи. И у меня еще сад, грядки...много чего своего. Вот такие мы чёкнутые.
про китайцев без всякой задней мысли. я живу в городе, здесь основная проблема, где этот выращенный (подаренный) урожай хранить.

Цитата:
Сообщение от Pridnya Посмотреть сообщение
Это хорошо. Я к тому клонил, что sprintf() большая универсальная функция, а другие как бы аналогичные, дают результат для конкретных диапазонов и типов данных...И вообще я не против, если тщательно протестированная функция будет работать быстрее и занимать меньше места чем тот же sprintf(), т.е. для тех же float. Это же хорошо, проделана большая полезная работа.
да-да, здесь ключевое слово "тщательно протестированная". в случае с принтф - это тысячи пользователей и миллионы использований. вперед...
Greg вне форума   Ответить с цитированием
Старый 11.05.2016, 18:25   #75
HHIMERA
Senior Member
 
Регистрация: 10.06.2008
Возраст: 55
Сообщений: 2,664
Вес репутации: 3694/96
HHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond repute
По умолчанию Re: Делюсь программой преобразования float в массив для вывода, например, на LCD

Цитата:
Сообщение от Vlad&mir Посмотреть сообщение
Я слегка "причесал" этот "примитив". Довёл его до signed long, погасил ведущие нули, добавил терминальный ноль и т.п.
На 9999999... не взлетело...
__________________
"Я не даю готовых решений, я заставляю думать!"(С)
HHIMERA вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Присоветуйте тип и способ управления MOSFETом "верхнего" плеча dr_Sash Источники питания и силовая электроника 37 08.09.2012 18:50
подключение магнитолы Sergey1 Общетехнические вопросы 10 27.12.2007 22:39
Помогите, пожалуйста, найти ошибку в коде Катя Микроконтроллеры других производителей 26 08.12.2007 14:58
проблемка с PIC16F628A bereg_ok Продукция MICROCHIP 72 07.09.2007 11:00
LCD BC2004C посоветуйте что нибудь для начала на ассемблере Leonid_O Общетехнические вопросы 3 29.05.2007 10:15


Часовой пояс GMT +3, время: 16:26.


Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd. Перевод: zCarot