zheka 1 16 января, 2016 Опубликовано 16 января, 2016 · Жалоба Или может быть можно задать тип float сразу, чтобы у него после запятой было только два знака? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
toweroff 0 16 января, 2016 Опубликовано 16 января, 2016 · Жалоба Или может быть можно задать тип float сразу, чтобы у него после запятой было только два знака? а макс.значение целого? может, есть смысл отобрать у uint32_t 7 бит под сотые, чем тащить float? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zheka 1 16 января, 2016 Опубликовано 16 января, 2016 · Жалоба максимальное значение целого предполагается не более 1000 Нельзя ли конкретно, си строкой? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HardEgor 66 16 января, 2016 Опубликовано 16 января, 2016 · Жалоба Или может быть можно задать тип float сразу, чтобы у него после запятой было только два знака? Чем вам помешали лишние цифры - хотите создать свой тип float или при выводе не экран слишком много цифр? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zheka 1 16 января, 2016 Опубликовано 16 января, 2016 (изменено) · Жалоба Чем вам помешали лишние цифры - хотите создать свой тип float или при выводе не экран слишком много цифр? Мне форматированный вывод не поможет. У меня функция, которая выводит на экран значение float. Во избежание мерацния экрана выводит она его только тогда, когда значение меняется. Значение берется из АЦП. Как вы сами понимаете, все что после 2 знака сильно шумит. Лишняя нагрузка на контроллер по выводу информации Изменено 16 января, 2016 пользователем zheka Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Corvus 1 16 января, 2016 Опубликовано 16 января, 2016 · Жалоба Во избежание мерацния экрана выводит она его только тогда, когда значение меняется. Ну так выводите не по любому изменения, а по изменению, превышающему заданный порог. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zheka 1 16 января, 2016 Опубликовано 16 января, 2016 (изменено) · Жалоба Ну так выводите не по любому изменения, а по изменению, превышающему заданный порог. господа, можно я откажусь от дальнейшего раскрытия своей задачи, а повторю вопрос - как округлить float до 2-х знаков после запятой? Спасибо за участие, но я хочу услышать ответ именно на этот вопрос, а не объяснять каждый раз почему предложенные альтернативы мне не подходят. Я не тупой, чтобы не знать, как отформатировать float в sprintf до двух знаков. Я не тупой, чтобы не знать как установить порог. Если я спрашиваю, как округлить float, значит для меня это опитмальный вариант и я не хочу отнимать ваше время, объяснением, почему другие варианты не подходят. Изменено 16 января, 2016 пользователем zheka Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GetSmart 0 16 января, 2016 Опубликовано 16 января, 2016 · Жалоба У меня функция, которая выводит на экран значение float. Во избежание мерацния экрана выводит она его только тогда, когда значение меняется. Значение берется из АЦП. Как вы сами понимаете, все что после 2 знака сильно шумит. Лишняя нагрузка на контроллер по выводу информации А эта функция сама не может сравнить то, что ей передали сейчас и то, что она ранее выводила? Например, переданное ей число умножить на 100 и сразу преобразовать в int/long. И сравнить с ранее выведенным числом. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zheka 1 16 января, 2016 Опубликовано 16 января, 2016 (изменено) · Жалоба А эта функция сама не может сравнить то, что ей передали сейчас и то, что она ранее выводила? Например, переданное ей число умножить на 100 и сразу преобразовать в int/long. И сравнить с ранее выведенным числом. господа! То что вы предлагаете - это вычисления. Округление проще. Я не знаю как округлять float в C, потому и спросил. Если подобной функции среди стандартных нет, то так и скажите. Я САМ напишу что-нибудь, сравнивающее значения, определяющее пороги или еще что-то подобное и не буду вас отвлекать. Но если есть что-то типа round(3.2222, 2), то буду рад об этом узнать. Изменено 16 января, 2016 пользователем zheka Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
amaora 21 16 января, 2016 Опубликовано 16 января, 2016 · Жалоба Десятичное округление надо делать во время преобразования в десятичный вид. Во float число не может хранится округленным до сотых. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Corvus 1 16 января, 2016 Опубликовано 16 января, 2016 · Жалоба То что вы предлагаете - это вычисления. Оно в любом случае будет. С помощью стандартных функций: #include <math.h> float val = 37.777779; float rounded_down = floorf(val * 100) / 100; /* Result: 37.77 */ float nearest = roundf(val * 100) / 100; /* Result: 37.78 */ float rounded_up = ceilf(val * 100) / 100; /* Result: 37.78 */ http://stackoverflow.com/questions/1343890...mal-places-in-c Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zheka 1 16 января, 2016 Опубликовано 16 января, 2016 · Жалоба Corvus я добавил #include <math.h>, floorf и все остальное мой компилятор KEIL не знает. Попробовал просто ради интереса NEW_INFO_VAR.SYSTEM_VOLTAGE=GetValue(); NEW_INFO_VAR.SYSTEM_VOLTAGE=(NEW_INFO_VAR.SYSTEM_VOLTAGE*100)/100; Посмотрел отладчиком - значения одинаковые. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
M_Andrey 0 16 января, 2016 Опубликовано 16 января, 2016 · Жалоба Имея over 1800 сообщений на форуме не знать возможностей языка С как-то странно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zheka 1 16 января, 2016 Опубликовано 16 января, 2016 · Жалоба Имея over 1800 сообщений на форуме не знать возможностей языка С как-то странно. А вы их знаете? Пардон... math.h подключился, функции компилятор знает. Но результат странный. Если было число 19.69385769, то после округления получается 19.600000004 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GetSmart 0 16 января, 2016 Опубликовано 16 января, 2016 (изменено) · Жалоба То что вы предлагаете - это вычисления. Округление проще. Я не знаю как округлять float в C, потому и спросил. Это был самый оптимизированный вариант, на чём и акцентировалась задача. Без непонятной экзотики и для любого компилятора. Вычислять можно в том месте, где собирались округлять. Update float в принципе не может хранить все дробные числа с точностью после запятой только два знака. Там часто число либо больше, либо меньше нужного на какой-то небольшой "мусор". Почитайте стандарт на float. Изменено 16 января, 2016 пользователем GetSmart Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться