Я работаю с 8-битным чипом AVR. Нет типа данных для 64-битного двойного (двойные только карты для 32-битного поплавка). Тем не менее, я буду получать 64-битные удваивания по сравнению с Serial и должен выводить 64-разрядные удвоения по сравнению с Serial.
Как я могу конвертировать 64-битный двойной в 32-битный поплавок и обратно без кастования? Формат для 32-разрядных и 64-битных будет соответствовать IEEE 754. Конечно, Я предполагаю потерю точности при преобразовании в 32-битный float.
Для преобразования из 64-битного в 32-битный float я пытаюсь это сделать:
// Script originally from http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1281990303
float convert(uint8_t *in) {
union {
float real;
uint8_t base[4];
} u;
uint16_t expd = ((in[7] & 127) << 4) + ((in[6] & 240) >> 4);
uint16_t expf = expd ? (expd - 1024) + 128 : 0;
u.base[3] = (in[7] & 128) + (expf >> 1);
u.base[2] = ((expf & 1) << 7) + ((in[6] & 15) << 3) + ((in[5] & 0xe0) >> 5);
u.base[1] = ((in[5] & 0x1f) << 3) + ((in[4] & 0xe0) >> 5);
u.base[0] = ((in[4] & 0x1f) << 3) + ((in[3] & 0xe0) >> 5);
return u.real;
}
Для чисел, таких как 1.0 и 2.0, это работает, но когда я тестировал с передачей в 1.1 в виде 64-битного двоичного кода, выход был отключен бит (буквально, а не каламбуром!), хотя это может быть проблема с моим тестированием. См:
// Comparison of bits for a float in Java and the bits for a float in C after
// converted from a 64-bit double. Last bit is different.
// Java code can be found at https://gist.github.com/912636
JAVA FLOAT: 00111111 10001100 11001100 11001101
C CONVERTED FLOAT: 00111111 10001100 11001100 11001100