Рейтинг:
1
OriginalGriff
Я сам попробовал это сделать с помощью онлайн компилятора языка Си:
int main()
{
float f = 20.20, g = 10.08;
char buff[100];
printf("%.2f %.2f\n", f, g);
sprintf(buff, "%.2f %.2f\n", f, g);
printf(buff);
return 0;
}
И получил именно то, что ожидал:
20.20 10.08
20.20 10.08
Проверьте специальную документацию для вашего компилятора и строку формата printf / sprintf - в ней могут быть некоторые странности. Также пробовать:
sprintf(buff, "%0.2f %0.2f\n", f, g);
И посмотрим, исправит ли это ситуацию.
Member 13892404
Спасибо. Но у меня есть продолжение. Относится ли это только к константам? что произойдет, если это плавающая переменная, которая изменяется в реальном времени? Потому что именно так я установил его в своей прошивке. Я ожидаю, что мои вольты и ток будут постоянно меняться, и хочу, чтобы мой ЖК-дисплей печатал их в режиме реального времени динамически.
OriginalGriff
Те являются переменные с плавающей запятой...
Member 13892404
Вы случайно не знаете, как я могу усечь результат с плавающей точкой в виде целого числа?? я помню, как использовал fabs() для преобразования отрицательных значений float в положительные. существует ли аналогичная функция для преобразования float в целое число?
OriginalGriff
Как говорит Рик - вы можете просто бросить его:
int x = (int) myfloat;
Rick York
Ничего не будет "происходить" - ценность будет просто другой. Функция sprintf не знает и не заботится о том, являются ли значения, которые она видит, константами или нет - она будет считать их просто значением в стеке, которое она не изменит. Вам придется либо отправлять данные, либо запрашивать их с устройства достаточно часто, чтобы увидеть их изменение.
Member 13892404
Понял ! Спасибо
Рейтинг:
0
CPallini
Если вы используете SPI
тогда вы, вероятно, используете микроконтроллер. Теперь, в библиотеках микроконтроллеров, может случиться так, что sprintf
реализации не являются полнофункциональными. Проверьте документацию компилятора.
Обратите внимание, что обработка значений с плавающей запятой может быть тяжелой задачей, особенно при низких ресурсах 8
бит и 16
немного MCU
s. Вместо этого часто можно использовать правильно масштабированную целочисленную арифметику.
Member 13892404
Да, я использую микроконтроллер TI C2000 concerto. Платформа, которую я кодирую, находится в CCS, я прошел через все рекомендации при использовании операций ввода-вывода C в CCS. Я изменил область действия библиотечных функций, улучшил размер стека и размер кучи, чтобы при использовании функции sprintf у меня не заканчивалась память. Я также включил необходимые заголовочные файлы.
Я обновил свою попытку следующим образом, и она по-прежнему ничего не меняла,
функции sprintf(строках,"%0.2 F для постоянного тока",Actual_Voltage);
sprintf(stringB,"%0.2 f A",Actual_Current);
sprintf(buffer1,"%s %s",stringA,stringB);
strcpy(stringC,buffer1);
он печатает
.2-ой этаж В постоянного тока .2-ой этаж в
Member 13892404
Да, это, кажется, прекрасно работает для целых чисел. Но не печатает поплавок.
CPallini
Не должно быть трудно работать с целочисленной математикой, используя сотые числа.
Member 13892404
когда я преобразовал типы данных в целые числа, он выводит желаемые результаты. Но я пытаюсь спроектировать очень чувствительное устройство преобразователя мощности, управляемое IGBT, и моя обратная связь очень чувствительна даже к небольшим изменениям напряжения. И поэтому игнорировать значение после десятичной дроби было бы нежелательно. Хотя, если дело дойдет до драки, мне, возможно, придется согласиться на это. Может быть, вы знаете функцию, которая усекает результат с плавающей запятой в целое число??
CPallini
Обычно вам на самом деле не нужны значения с плавающей запятой (например, если у вас есть датчик с разрешением микровольт, то вы, вероятно, измеряете милливольты, поэтому 16-битного целого числа будет достаточно. С другой стороны, если вам действительно нужны значения с плавающей запятой, то вы можете выполнить вычисления, используя их, и в конце вычисления преобразовать их в целые числа (правильно масштабированные), чтобы удовлетворить требованиям представления данных.
Member 13892404
Понял ! Спасибо
CPallini
Добро пожаловать.