Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как не тащить в проект float
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
toweroff
Добрый вечер

Есть ADC, меряет напряжение питания. Значение напряжения должно отображаться
Как не тащить ради только одной этой штуки за собой целый float?

Фактически, мне нужно целочисленное значение ADC умножить на 0.006123 и отобразить до первого знака после запятой, бОльшая точность не требуется
Dog Pawlowa
Цитата(toweroff @ Oct 6 2015, 22:18) *
значение ADC умножить на 0.006123 и отобразить до первого знака после запятой


Как-то так:

unsigned int adc;
unsigned int voltage;

voltage=(unsigned int) (((long)adc * (long)6123)/100000L);
printf ("%u.%u", voltage/10,voltage%10);


Эдди
Здесь я использовал для отображения напряжений и температур только целочисленную арифметику. При помощи цепных дробей (ЕМНИП, функция rat в Octave) можно с достаточной точностью десятичную дробь представить в виде отношения целых чисел A/B.
Вот только нужно заранее позаботиться, чтобы при умножении не возникло переполнения.

Пример: ваше число == 1/(163 + 1/(3 + 1/(7 + 1/4)))
а) 1/163 = 0.0061350
б) 1/(163+1/3) = 3/(163*3+1) = 3/490 = 0.0061224
ну или на худой конец 6123/1000000.
Чтобы были сотые, умножаем результат на 100 → для варианта б) имеем: 300/490 → значение переводится элементарно: X*300/490 и будет искомой величиной в сотых долях.
CrimsonPig
Цитата(toweroff @ Oct 6 2015, 20:18) *
Фактически, мне нужно целочисленное значение ADC умножить на 0.006123 и отобразить до первого знака после запятой, бОльшая точность не требуется


Хм, а целочисленно разделить значение ADC на 163 не прокатит ? sm.gif
Ну или умножить значение ADC на 10, целочисленно разделить 1633, потом сделать ldiv на 10, получить частное и остаток.
_pv
помножить на 4013, добавить 32768 (ну или не добавлять если правильное округление не нужно) и отбросить два младших байта.
результат будет в десятых долях.
toweroff
Всем спасибо.
Выбросил float, использовал "легкий" xprintf, в результате освободилось почти 3.5 кбайт
toweroff
Напишу сюда, дабы не плодить лишних тем

xprintf - отлично, большое спасибо старику Чену

где бы накопать из того же ряда xsscanf?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.