C中的固定点数没有浮点数

时间:2013-06-06 12:14:49

标签: c numbers fixed-point

在C中是否可以以二进制形式呈现固定点数,以便在不使用浮点数的情况下传输?

我知道如何将float或double转换为所需的固定点表示,但是当没有浮点时我会被卡住。问题是我必须开发的系统有这个限制。

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

更新

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

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

这种转换是我的问题,忽略了signdness当你可以使用float来转换时,这是很安静的事情(代码没有经过测试,但必须像这样工作):

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;

甚至可能吗?如上所述,我真的被困在这里。

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

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

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

这就是说,它完全取决于整数值的样子以及它们如何表示。几乎在任何情况下,你都可以对它进行乘法或除法,并完成。

答案 1 :(得分:0)

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

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

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

应该给你 dest 等于 src

希望这会有所帮助。