0

在 C 中是否可以以二进制形式表示一个定点数,以便可以在不使用浮点数的情况下传输它?

我知道如何将浮点数或双精度数转换为所需的定点表示,但是当它应该在没有浮点的情况下完成时我被卡住了。问题是我必须开发的系统有这个限制。

我的想法是创建一个包含完整表示和可处理整数和小数部分的结构。在仅使用接收到的二进制表示或整数和小数值创建结构之后,应该有一个进行转换的函数。

更新:

我的问题似乎不够精确,所以我将添加一些细节。

在我的代码中,我必须以某个定点表示形式创建和接收数字。正如下面的答案所描述的,这只不过是一个指向位序列的指针。我的问题是我必须在发送时创建这个位序列,或者在接收信息时对其进行解释。

这种转换是我忽略签名的问题,当您可以使用浮点数进行转换时,这很容易做到(代码未经测试,但必须像这样工作):

float sourceValue = 12.223445;    
int intPart = 0;
float fractPart = 0.0;
//integer part is easy, just cast it
intPart = (int)sourceValue;
//the fractinoal part is the rest
fractPart = sourceValue - intPart;


//multipling the fract part by the precision of the fixed point number (Q9.25)
//gets us the fractional part in the desired representation
u_int64_t factor = 1;
factor = factor << 25;
u_int64_t fractPart = fractPart * factor; 

其余的可以通过一些移位和使用逻辑位运算符来完成。

但是我怎么能在中间没有浮动的情况下做到这一点,从这样的开始:

int intPart = 12;
int fractPart = 223445;

甚至可能吗?如前所述,我有点卡在这里。

谢谢你的帮助!

4

2 回答 2

1

我不知道你到底在做什么,但是定点数可以看作是一个整数,并应用了一个常数因子。

例如,如果你想在区间 [0; 1)16位,可以映射到范围[0; 65536)只需将其乘以 65536。

这就是说,这完全取决于您的整数值的外观以及它们的表示方式。几乎在任何情况下,您都可以对其应用乘法或除法并完成。

于 2013-06-06T13:17:00.953 回答
0

一切都归结为位,无论是整数、浮点数等。您所需要的只是内存基地址和特定内存的大小。例如,

float src = 0.5;
float dest;
char bytes[sizeof(src)];    

memcpy(bytes, &num, sizeof(src));
dest = *((float *)bytes);

应该给你dest等于src

希望这有帮助。

于 2013-06-06T12:43:00.977 回答