Страница 1 из 1

СИ и double

Добавлено: Чт авг 29, 2013 10:36:20
СергейКир
Здравствуйте.
Язык СИ. МК-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

Прошу помощи, как реализовать правильный алгоритм.
Спасибо заранее.

Re: СИ и double

Добавлено: Чт авг 29, 2013 11:01:32
a_skr
105.6%100=56 - это как получилось? :dont_know:
% - остаток от деления целых. должно было получиться 105%100=5

если уж каким-то способом удалось получить 56, то вывести число с незначащими нулями можно так:
printf("%03d",56);

Re: СИ и double

Добавлено: Чт авг 29, 2013 11:33:06
СергейКир
можно так:
printf("%03d",56)
Спасибо.
С Вашей помощью получилось вывести 1.05

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

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

Спасибо ещё раз.

Re: СИ и double

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

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

А вообще для описанной задачи существует функция modf.

Re: СИ и double

Добавлено: Пт сен 06, 2013 15:13:53
Antifritz
А еще, в AtmelStudio, double и float - одно и тоже - 4 байта (стандартный float), так что тип double лучше вообще не использовать.

Re: СИ и double

Добавлено: Пт сен 06, 2013 16:17:00
mehanik_all
Попробуй так

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

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

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