【发布时间】:2017-01-18 09:29:29
【问题描述】:
我需要将浮点数转换为 Q31 定点,Q31 表示 1 个符号位,0 位表示整数部分,31 位表示小数部分。这意味着Q31只能表示[-1,0.9999]范围内的数字。
根据定义,当从浮点数转换为定点数时,会乘以2ˇN,其中 N 是小数部分的大小,在本例中为 31。
但是,我对这段代码感到困惑,它看起来不正确,但有效:
#define q31_float_to_int(x) ( (int) ( (float)(x)*(float)0x7FFFFFFF ) )
而且它似乎工作正常。例如:
int a = q31_float_to_int(0.5f);
给出Hex: 0x40000000,没关系。
为什么这里的乘法是用2ˇ31 - 1,而不仅仅是2ˇ31?
【问题讨论】:
-
(float)0x7FFFFFFF是2147483648.00000: ideone.com/mawlXx 。即使在转换为unsigned之后,该值仍然成立:ideone.com/7WMeRE -
嗯??为什么 0x7FFFFFFF 最终是 2147483648 而不是 2147483647??
-
因为 2147483647 不能表示为
float,因此将采用最接近的可表示数字,即 2147483648。 -
知道为什么上面的代码不使用
(float)0x8000000而不是(float)0x7FFFFFFF吗? -
也许作者试图避免溢出和/或希望在
INT_MAX为0x7FFFFFFF的架构上表达1.0的值。不幸的是,这个解决方案不太可能成功或正确。
标签: c signal-processing fixed-point