Вывод числа с плавающей точкой - Си
Добавлено: Чт апр 30, 2015 05:48:16
Есть маленький вопросик, как вывести на LCD или семисегментник число с плавающей точкой. Например результат умножения числа 12 на константу 3.14?
Здесь можно немножко помяукать :)
https://radiokot.ru:443/forum/
Пожалуй самое дельное выражение... А как быть с результатом деления? Например делим константу 100 на любое число, возьмём 13?pokk писал(а):Умножаешь константу на 3.14*100........
Код: Выделить всё
void sprint_float(char *str, float f){
char tmp[10];
int i = f; // спорно: f может быть огромным числом, но чисто для примера пойдет
itoa(str, i, 10);
strcat(str, ".");
i = abs(f - i)*100; // 2 знака после запятой
itoa(tmp, i, 10);
strcat(str, tmp);
}Опять таки домножить константу на 100 (или другую всё зависит от точности которую надо) а потом поделитьА как быть с результатом деления? Например делим константу 100 на любое число, возьмём 13?
Хорошо. А два числа типа int при делении дадут целое число????pokk писал(а):Опять таки домножить константу на 100 (или другую всё зависит от точности которую надо).
можно: изучить Си по книгам.Dr. Alex писал(а):А изначально, в корне, нельзя решить вопрос?
см. выше - любите книгу, источник знаний!Dr. Alex писал(а):А два числа типа int при делении дадут целое число????
Разрешить компилятору работать с числами с плавающей точкой и, как писал ARV, использовать форматированный вывод. Памяти жрет немеряно и время для обработки тоже.Dr. Alex писал(а):А изначально, в корне, нельзя решить вопрос?
Код: Выделить всё
uint8_t strbuf[DISP_MAX_STRINGSIZE];
***
sprintf((char*)str_buff, "%1.2fV", (double)(displayData->battVoltage * 0.01f)); // Легко задается нужная точность и форматированный вывод.
чтобы памяти не жрало, надо переходить на ассемблер. Но тогда требуется "искусство программирования", а не тупое подключение библиотек.chief писал(а):Разрешить компилятору работать с числами с плавающей точкой и, как писал ARV, использовать форматированный вывод. Памяти жрет немеряно и время для обработки тоже.Dr. Alex писал(а):А изначально, в корне, нельзя решить вопрос?
А battVoltage в данном случае float? В противном случае немножко не понятно использование здесь float константы 0.01f с последуюшим приведением результата к double. ИМХО можно "сэкономить байты кода™" домножая на double константу 0.01 - тогда и приводить не понадобится - результат операции будет уже в double. Хотя, конечно, в зависимости от целевой платформы могут быть эффекты уже на размере исполняемого кода.DX168B писал(а):Код: Выделить всё
sprintf((char*)str_buff, "%1.2fV", (double)(displayData->battVoltage * 0.01f)); // Легко задается нужная точность и форматированный вывод.
Скорее - наоборот, понятно приведение к double, если battVoltage - целочисленный. А вот если бы battVoltage был типом с плавающей точкой, то приведение не совсем оправдано.А battVoltage в данном случае float? В противном случае немножко не понятно использование здесь float константы 0.01f с последуюшим приведением результата к double.
искусство программирования умерло, осталось ремесло.Kasha-bread писал(а):но тогда требуется "искусство программирования"
))))chief писал(а):Разрешить компилятору работать с числами с плавающей точкой и, как писал ARV, использовать форматированный вывод. Памяти жрет немеряно и время для обработки тоже.Dr. Alex писал(а):А изначально, в корне, нельзя решить вопрос?
Простите зануду - это я до суффикса f в константе прицепился - которой делает её float типом.Аlex писал(а):Скорее - наоборот, понятно приведение к double, если battVoltage - целочисленный. А вот если бы battVoltage был типом с плавающей точкой, то приведение не совсем оправдано.
Код: Выделить всё
battVoltage // тип int
0.01f // float
(battVolatge * 0.01f) // float
double(battVolatge * 0.01f) // double
Код: Выделить всё
battVoltage // тип int
0.01 // double
0.01 * battVolatge // double
// т.е. возвращаясь к исходной строчке:
sprintf((char*)str_buff, "%1.2fV", 0.01 * displayData->battVoltage);