Конвертировать 4 байта в 32-битное с плавающей точкой с высокой точностью в C? - PullRequest
0 голосов
/ 26 февраля 2019

У меня есть 4 байта, такие как со значением в качестве знака без знака: 63 129 71 174.

Предположительно, при преобразовании его в число с плавающей точкой оно должно стать 1.0099999904632568 .

Однако все, что я получил взамен, это 1.01, что недостаточно для точности того, что я делаю.

Я использовал популярные методы, такие как memcpy или uninion, но безрезультатно, что заставило меня поверить ...это какое-то ограничение в C?

Если да, то каково оптимальное решение?Спасибо.

РЕДАКТИРОВАТЬ: Извините за плохой пример.Я должен был выбрать лучший для моего случая.Считайте, что это 4 байта: 0 1 229 13.

Он очень маленький, как действительно очень маленький.Тем не менее, это 4 байта, поэтому он все равно представляет число с плавающей запятой .Однако C просто вернет 0. Я поставил 16 после десятичного числа, и он просто не работает.

Так почему и как работать с таким числом?

РЕДАКТИРОВАТЬ 2: Извините.Мой друг напутал.Она дала мне последовательность из 4 байтов и сказала, что это 32-битное число с плавающей запятой, но оказалось, что это 32, но без знака int.Это в значительной степени испортило весь мой день.ДЕЙСТВИТЕЛЬНО извините за беспокойство.

Полагаю, напрашивается вывод: не всегда доверяйте своему другу.

1 Ответ

0 голосов
/ 26 февраля 2019

Использование memcpy() на самом деле - путь.

#include <stdio.h>
#include <string.h>

int main(void)
{
  const unsigned char raw1[] = { 174, 71, 129, 63 };
  const unsigned char raw2[] = { 0, 1, 229, 13 };
  float x, y;
  memcpy(&x, raw1, sizeof x);
  memcpy(&y, raw2, sizeof y);
  printf("%.6f\n", x);
  printf("%g\n", y);
  return 0;
}

Это печатает 1.010000, я не думаю, что разумно ожидать большей точности от float.Обратите внимание, что я поменял местами порядок байтов, протестированный в системе с прямым порядком байтов, я думаю (ideone.com).

С %g для второго числа выводится 1.41135e-30.

...