Не вдаваясь в слишком много деталей, у меня есть две встроенные системы, ни одна из которых не может использовать библиотеку с плавающей запятой. Между ними - мобильное приложение, где выполняются некоторые вычисления. Один расчет должен поддерживать точность. Это значение отправляется клиенту через Bluetooth, как массив байтов. Когда он будет получен, я буду хранить его как uint32. Затем это значение снова используется совместно с мобильным приложением, где требуется точность. Там нет проблем, потому что я могу использовать класс ByteBuffer Java. Проблема в том, что мне также нужно поделиться этим значением с микропроцессором Z80 как с uint8, потому что он передается через UART и используется как счетчик ADC (0-255), поэтому он теряет точность (но в этом нет необходимости конец).Преобразование uint32 с плавающей запятой в uint8
Так что я делаю это в моем мобильном приложении с помощью Java:
int bits = Float.floatToIntBits(fAdcCount);
byte[] b = new byte[4];
b[0] = (byte)(bits & 0xff);
b[1] = (byte)((bits >> 8) & 0xff);
b[2] = (byte)((bits >> 16) & 0xff);
b[3] = (byte)((bits >> 24) & 0xff);
b
затем отправляется в BLE характерной записи в BLE микроконтроллера. Микроконтроллер BLE затем считывает этот буфер в виде 32-битного слова little-endian и сохраняет его в uint32
. Глядя на это uint32
в отладчике, отображаются правильные значения, и, как я уже сказал выше, я могу вернуть этот uint32
в массив байтов и отправить его в мобильное приложение и прочитать его с использованием класса ByteBuffer Java. Это отлично работает, я получаю правильное значение с плавающей запятой.
Проблема в том, что мне нужна целая часть этого представления с плавающей запятой для отправки на микропроцессор Z80 через UART в качестве uint8, поскольку он используется как счетчик ADC от 0 до 255.
Итак, как я могу преобразовать значение с плавающей запятой, которое было завернуто в uint32 (порядок младших байтов), чтобы uint8 потерял точность? Я также знаю, что диапазон составляет от 0 до 255, то есть никогда не будет больше 255,0 для преобразования.
Например, если у меня есть это:
uint32 fValue = 0x43246ADD; // = 164.417...
Как я могу получить это без использования поплавка ?:
uint8 result = 164;
Вы должны знать конкретный формат с плавающей точкой кодирования, которая не является обязательной в C. Вот [один такой формат] (https://en.wikipedia.org/wiki/Single-precision_floating-point_format). И интегральная часть может, скорее всего, не вместить 8 бит в любом случае. –
Можете ли вы объяснить, почему у вас есть значение с плавающей запятой, хранящееся в 'uint32'? И почему вы используете 'uint32', а не стандартный' uint32_t', определенный в ''? –
@KeithThompson Конечно, я работаю с двумя встроенными системами, один из которых представляет собой архитектуру Z80, для которой нужен результат как unit8 (0-255), а другой, который хранит данные как uint32, это не может быть изменено. Я столкнулся с проблемой, когда мне нужна точность с плавающей запятой из расчета и ее необходимо было сохранить, но не смог передать ее как float, поэтому он был завернут в uint32. Однако при совместном использовании этих данных с микропроцессором Z80 он не может использовать библиотеку с плавающей запятой или uint32, ее необходимо отправить как uint8 (0-255). – DigitalNinja