32-разрядное в 16-разрядное преобразование с плавающей запятой - PullRequest
35 голосов
/ 02 ноября 2009

Мне нужна кроссплатформенная библиотека / алгоритм, который будет конвертировать между 32-битными и 16-битными числами с плавающей запятой. Мне не нужно выполнять математику с 16-битными числами; Мне просто нужно уменьшить размер 32-битных операций с плавающей точкой, чтобы их можно было отправлять по сети. Я работаю в C ++.

Я понимаю, какую точность я бы потерял, но это нормально для моего приложения.

Отлично подойдет 16-битный формат IEEE.

Ответы [ 12 ]

0 голосов
/ 09 сентября 2014

У меня была такая же проблема, и я нашел эту ссылку очень полезной. Просто импортируйте файл "ieeehalfprecision.c" в ваш проект и используйте его так:

float myFloat = 1.24;
uint16_t resultInHalf;
singles2halfp(&resultInHalf, &myFloat, 1); // it accepts a series of floats, so use 1 to input 1 float

// an example to revert the half float back
float resultInSingle;
halfp2singles(&resultInSingle, &resultInHalf, 1);

Также меняю какой-то код (см. Комментарий автора (Джеймс Турса) в ссылке):

#define INT16_TYPE int16_t 
#define UINT16_TYPE uint16_t 
#define INT32_TYPE int32_t 
#define UINT32_TYPE uint32_t
0 голосов
/ 12 декабря 2012

Вопрос старый и на него уже дан ответ, но я подумал, что стоит упомянуть библиотеку C ++ с открытым исходным кодом, которая может создавать 16-битные IEEE-совместимые с плавающей точкой половинной точности и имеет класс, который действует почти так же, как встроенный тип float , но с 16 битами вместо 32. Это класс "half" библиотеки OpenEXR . Код находится под разрешающей лицензией в стиле BSD. Я не верю, что у него есть какие-либо зависимости вне стандартной библиотеки.

...