СИ и double

Обсуждаем контроллеры компании Atmel.
Ответить
Открыл глаза
Сообщения: 55
Зарегистрирован: Чт май 30, 2013 15:05:07

Сообщение СергейКир »

Здравствуйте.
Язык СИ. МК-Mega8. Среда - AVRStudio6
Вывожу символы на LCD.
Пытаюсь сделать следующее:

Код: Выделить всё

double u=105.6;
char ADC_[10];
//..............
sprintf(ADC_,"%d.%d",u/100,u%100);
Получается 105.6/100=1
105.6%100=56
Выводит в итоге 1.56, а мне надо 1.056

Прошу помощи, как реализовать правильный алгоритм.
Спасибо заранее.
Реклама
Вымогатель припоя
Сообщения: 630
Зарегистрирован: Пн июн 14, 2010 13:07:29
Откуда: Жуковский

Сообщение a_skr »

105.6%100=56 - это как получилось? :dont_know:
% - остаток от деления целых. должно было получиться 105%100=5

если уж каким-то способом удалось получить 56, то вывести число с незначащими нулями можно так:
printf("%03d",56);
Реклама
Открыл глаза
Сообщения: 55
Зарегистрирован: Чт май 30, 2013 15:05:07

Сообщение СергейКир »

можно так:
printf("%03d",56)
Спасибо.
С Вашей помощью получилось вывести 1.05

Код: Выделить всё

sprintf(ADC_,"%d.%02d",u/100,u%100);
105.6%100=56 - это как получилось?
56 получалось, я просто не весь код привёл.

Спасибо ещё раз.
YS
Друг Кота
Аватара пользователя
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05

Сообщение YS »

Начнем с того, что использовать вещественный тип в контроллере, в котором нет FPU, - чрезвычайно плохая идея сама по себе. Используйте арифметику с фиксированной точкой.

sprintf тоже не уменьшит размер и не увеличит скорость кода.

А вообще для описанной задачи существует функция modf.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Прорезались зубы
Аватара пользователя
Сообщения: 222
Зарегистрирован: Чт июл 08, 2010 01:03:40
Откуда: Украина, Киев

Сообщение Antifritz »

А еще, в AtmelStudio, double и float - одно и тоже - 4 байта (стандартный float), так что тип double лучше вообще не использовать.
Реклама
Открыл глаза
Аватара пользователя
Сообщения: 47
Зарегистрирован: Вт авг 13, 2013 12:13:07

Сообщение mehanik_all »

Попробуй так

Код: Выделить всё

sprintf(ADC_, "%.3f", u/100);
3 - кол-во знаков после запятой.

Так же здесь много интересного можно узнать:
http://ru.wikipedia.org/wiki/Printf
Реклама
Ответить

Вернуться в «AVR»