c代码序列化double和浮点数与指数基数10

时间:2012-02-13 17:39:14

标签: c networking serialization floating-point double

我需要一个快速的解决方案来将float(4个字节)和double(8个字节)序列化为二进制表示,以便通过网络发送它们。

问题是我必须使用的格式:

  

尾数* 10 ^指数

其中尾数是有符号整数(编码float时为4个字节,double为8个字节),指数编码为1个字节。

指数是一个基数10,所以位移技巧对我来说似乎没用,我必须将尾数与exponenet分开才能序列化它们。

任何建议都将不胜感激

2 个答案:

答案 0 :(得分:2)

您对编码的尾数是整数的说法让我感到困惑。它必须表示某种形式的浮点数,可能以4或8个字节编码。

对于任何正数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,您需要在应用上述代码之前取绝对值,然后以适当的方式对符号进行编码。

这是三个非平凡的浮点运算,但这些都是硬件在硬件上完成的。您仍然必须解决将尾数编码为四个或八个字节值的问题。

答案 1 :(得分:0)

为什么需要查看表示?

如何在连接的各端使用htonl和ntohl函数,并以二进制形式发送它们。