Если ваше приложение не чувствительно к числовому значению, вы можете использовать следующий подход:
Вместо использования двойников в вашей структуре (которые не строго стандартизированы, как указано в комментариях), вы можете использовать дваint32_t
, a
и b
для представления значащего и показателя степени, такого как
a * 2 ^ b = original_double
Таким образом, ваша структура будет выглядеть примерно так:
struct SamplePayload {
int32_t A_sig;
int32_t A_exp;
//B,C...
} payload;
Тогда на принимающей стороне вам нужно будет только умножить в соответствии с формулой выше, чтобы получить оригинальный дубль.
C предоставляет вам аккуратную функцию, frexp
, чтобы упростить ситуацию.
Но поскольку мы храним и a
, и b
как целые числа, нам нужно немного изменить результаты, чтобы получить высокую точность.
В частности, поскольку a
гарантированно находится в диапазоне от 0,5 до 1, вам необходимо умножить a
на 2 ^ 30 и вычесть 30 из b
, чтобы не переполнить.
Вот пример:
#include <stdio.h> /* printf */
#include <math.h> /* frexp */
#include <stdint.h>
int main ()
{
double param, result;
int32_t a,b;
param = +235.0123123;
result = frexp (param , &b);
a=(result*(1<<30)) /*2^30*/; b-=30;
printf ("%f = %d * 2^%d\n", param, a, b); //235.012312 = 985713081 * 2^-22
return 0;
}