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).

Мне удалось преобразовать шестнадцатеричное число в число с плавающей запятой. Может кто-нибудь помочь мне в сравнении двух значений с плавающей запятой?

, 👍0

Обсуждение

В каком формате вы отправляете поплавок по серийному номеру? Десятичное число в кодировке ASCII? Шестнадцатеричное число в кодировке ASCII? двоичный? В настоящее время вы читаете десятичное число в кодировке ASCII., @chrisl

обратите внимание, что вы создаете массив символов floatString размера 9. ваш индекс 10 выходит за пределы! также есть множество решений для вашей проблемы в Интернете. просто введите «шестнадцатеричная строка для плавания» в любом веб-поиске, @Piglet

Чего *точно* вы пытаетесь достичь с помощью всего этого преобразования с плавающей запятой в шестнадцатеричное? Мне кажется, что вы пытаетесь решить проблему и у вас есть предвзятое, но неверное представление о том, как это сделать. Какую настоящую проблему вы пытаетесь решить здесь?, @Majenko

Позвольте мне отредактировать вопрос для лучшего понимания. Извините за неуместный вопрос., @Josh Earnest

Я предполагаю, что вы говорите не о шестнадцатеричных данных, а о двоичных данных, представляющих «двойное» или float64 в формате IEEE 754. Чтобы сравнить два массива по 8 байт на равенство, используйте memcmp, @DataFiddler

Вам необходимо уточнить свой вопрос. Как говорит @DataFiddler, похоже, что вы вводите двоичное представление числа с плавающей запятой в формате с плавающей запятой IEEE. Вам нужно отредактировать свой вопрос, чтобы уточнить., @Duncan C


1 ответ


1

Известно, что сравнивать значения с плавающей запятой очень сложно. Это связано с тем, что число с плавающей запятой является приблизительным.

Сначала вам следует определить предел погрешности — значение, которое показывает, насколько близко должны быть два значения друг к другу, прежде чем вы сочтете их одинаковыми.

Например, 1,000000 и 1,000001 во многих случаях могут считаться одним и тем же значением.

Самый простой способ — просто вычесть одно значение из другого, взять абсолютное значение результата и посмотреть, находится ли оно ниже допустимой погрешности.

bool almost(float a, float b, float margin) {
  float diff = fabs(a - b);
  return (diff < margin);
}
,

Спасибо за ответ, @Josh Earnest