1 в шестнадцатеричном формате с плавающей запятой 1 - Сравните число с плавающей запятой 1 с предопределенным числом с плавающей запятой 2 - Если числа с плавающей запятой 1 и число с плавающей запятой 2 совпадают - Выведите шестнадцатеричное число 2
Я хочу ввести шестнадцатеричные данные из классного терминала, например, (05 00 02 03 00 04 00 E5) и преобразовать данные в число с плавающей запятой, скажем, 45,3. Теперь, когда мне нужно предварительно назначить значение с плавающей запятой, скажем, 45,3 в моей программе, чтобы я мог сравнить преобразованное значение с плавающей запятой с предварительно назначенным значением с плавающей запятой. Если два значения совпадают, мне нужно напечатать другое шестнадцатеричное значение, например (05 03 00 01 00 02 04 4F).
Мне удалось преобразовать шестнадцатеричное число в число с плавающей запятой. Может кто-нибудь помочь мне в сравнении двух значений с плавающей запятой?
@Josh Earnest, 👍0
Обсуждение1 ответ
Известно, что сравнивать значения с плавающей запятой очень сложно. Это связано с тем, что число с плавающей запятой является приблизительным.
Сначала вам следует определить предел погрешности — значение, которое показывает, насколько близко должны быть два значения друг к другу, прежде чем вы сочтете их одинаковыми.
Например, 1,000000 и 1,000001 во многих случаях могут считаться одним и тем же значением.
Самый простой способ — просто вычесть одно значение из другого, взять абсолютное значение результата и посмотреть, находится ли оно ниже допустимой погрешности.
bool almost(float a, float b, float margin) {
float diff = fabs(a - b);
return (diff < margin);
}
Спасибо за ответ, @Josh Earnest
- Избегайте математических вычислений с плавающей запятой, чтобы ускорить Arduino
- Все float возвращают округленное целое число в меньшую сторону.
- C++ против языка Arduino?
- Как использовать SPI на Arduino?
- Float печатается только 2 десятичных знака после запятой
- Какие накладные расходы и другие соображения существуют при использовании структуры по сравнению с классом?
- Ошибка: expected unqualified-id before 'if'
- Отправка и получение различных типов данных через I2C в Arduino
В каком формате вы отправляете поплавок по серийному номеру? Десятичное число в кодировке ASCII? Шестнадцатеричное число в кодировке ASCII? двоичный? В настоящее время вы читаете десятичное число в кодировке ASCII., @chrisl
обратите внимание, что вы создаете массив символов
floatString
размера 9. ваш индекс 10 выходит за пределы! также есть множество решений для вашей проблемы в Интернете. просто введите «шестнадцатеричная строка для плавания» в любом веб-поиске, @PigletЧего *точно* вы пытаетесь достичь с помощью всего этого преобразования с плавающей запятой в шестнадцатеричное? Мне кажется, что вы пытаетесь решить проблему и у вас есть предвзятое, но неверное представление о том, как это сделать. Какую настоящую проблему вы пытаетесь решить здесь?, @Majenko
Позвольте мне отредактировать вопрос для лучшего понимания. Извините за неуместный вопрос., @Josh Earnest
Я предполагаю, что вы говорите не о шестнадцатеричных данных, а о двоичных данных, представляющих «двойное» или float64 в формате IEEE 754. Чтобы сравнить два массива по 8 байт на равенство, используйте
memcmp
, @DataFiddlerВам необходимо уточнить свой вопрос. Как говорит @DataFiddler, похоже, что вы вводите двоичное представление числа с плавающей запятой в формате с плавающей запятой IEEE. Вам нужно отредактировать свой вопрос, чтобы уточнить., @Duncan C