c кодом сериализации double и float с показателем базы 10 - PullRequest
0 голосов
/ 13 февраля 2012

Мне нужно быстрое решение для сериализации чисел с плавающей запятой (4 байта) и двойного (8 байт) в двоичное представление для отправки их по сети.

Проблема в формате, который я должен использовать:

мантисса * 10 ^ экспонента

, где мантисса представляет собой целое число со знаком (4 байта при кодировании числа с плавающей запятой и 8 байтов для двойного), а показатель степени закодирован в 1 байт.

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

Любое предложение будет оценено.

Ответы [ 2 ]

2 голосов
/ 13 февраля 2012

Ваше утверждение, что закодированная мантисса является целым числом, смущает меня. Он должен представлять некоторую форму числа с плавающей запятой, возможно, закодированного в четыре или восемь байтов.

Для любого положительного числа x вы можете однозначно выразить x как

x = 10^(f + n) = 10^f * 10^n

, где n - целое число, а 0 <= f < 1. Обратите внимание, что

f + n = log10(x)

по определению.

Для положительного x простейший код, который я могу себе представить, таков:

double lg10 = log10(x);
double f = fmod(lg10, 1.0);
int n = lg10 - f
encode_mantissa(pow(10.0, f));
encode_exponent(n);

Для отрицательного значения x вам необходимо принять абсолютное значение перед применением вышеуказанного кода, а затем закодировать знак любым подходящим способом.

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

0 голосов
/ 14 февраля 2012

зачем вам нужно смотреть на представление?

Как насчет использования функций htonl и ntohl на соответствующих концах ваших соединений и отправки их в двоичном виде.

...