我在用皮质M3获取离散傅里叶变换我使用CMSIS DSP函数arm_cmplx_mag_q31计算幅度。文档说它以2.30的格式返回结果(我假设整数是2位,小数部分是30位;没有符号位,因为幅度不能为负)。
我试图将结果输出给用户,但我发现很难打印出正确的值。
我已经尝试过使用typedef定义一个新的联合体,我可以像这样存储整数和小数部分
/* 2.30 union*/
typedef union {
uint32_t full;
struct {
uint32_t fpart:30;
uint8_t ipart:2;
} parts;
} fixed2_30_t;
字符串
然后将2.30星等结果存储到fixed2_30_t变量中,并尝试打印其部分
fixed2_30_t result;
result = magnitude;
sprintf(msg, "final results %0d.%010u",
result.parts.ipart, result.parts.fpart / 1073741824);
型
我将小数部分除以2^30以将其缩放回小数,但我没有获得合理的结果,并且我不完全确定我的零填充是否正确。
打印的正确方法是什么?如何确定要使用的零填充?
谢谢你,谢谢
2条答案
按热度按时间yc0p9oo01#
如何正确打印2.30定点变量
若要打印到
.
后面的10位小数,请将分数缩放1010,然后除以232。使用
unsigned long long
数学来确保概率。请注意,下面的乘积(最大值为.fpart
)是一个64位正值。字符串
注意:小于10个小数位,舍入可能会改变整数部分。
acruukt92#
假设您的Cortex M3对64位整数算术有足够好的支持(支持C99或更高版本-需要64位算术),那么这段代码将展示如何完成。
字符串
我得到的输出是:
型
例如,可以使用
bc
验证计算。我把程序叫做fp71
。型
这些结果是一致的--除了我更喜欢输出中小数点前的前导零。