在一个似乎运作良好的程序中,我有以下声明:
#include <stdio.h>
#include "system.h"
signed char input[4]; /* The 4 most recent input values */
char get_q7( void );
void put_q7( char );
void firFixed(signed char input[4]);
const int c0 = (0.0299 * 128 + 0.5); /* Converting from float to Q7 is multiplying by 2^n i.e. 128 = 2^7 since we use Q7 and round to the nearest integer*/
const int c1 = (0.4701 * 128 + 0.5);
const int c2 = (0.4701 * 128 + 0.5);
const int c3 = (0.0299 * 128 + 0.5);
const int half = (0.5000 * 128 + 0.5);
enum { Q7_BITS = 7 };
void firFixed(signed char input[4])
{
int sum = c0*input[0] + c1*input[1] + c2*input[2] + c3*input[3];
signed char output = (signed char)((sum + half) >> Q7_BITS);
put_q7(output);
}
int main(void)
{
int a;
while(1)
{
for (a = 3 ; a > 0 ; a--)
{
input[a] = input[a-1];
}
input[0]=get_q7();
firFixed(input);
}
return 0;
}
但是我不明白如何将一个小数作为int
声明,这是用常数来完成的。它应该是Q7表示法,但为什么这样做,编译器如何接受一个小数的int?它是否只取分数的整数部分,如果是这样,为什么不需要强制转换?
答案 0 :(得分:3)
当浮点值转换为整数时,它是截断。这意味着只需删除小数点后的所有数字。例如。 12.34
变为12
,12.99
也变为12
。没有四舍五入。
这就是+ 0.5
部分在初始化中的作用。它只是一种通过舍入将浮点值转换为整数的方法。例如,0.0299 * 128
为3.8272
,其被截断为3
。但是+ 0.5
被截断的4.3272
变为4
,这是3.8272
的舍入值。
但是仍然可能存在问题,您可能需要阅读What Every Computer Scientist Should Know About Floating-Point Arithmetic以了解详情。
答案 1 :(得分:1)
仅在类型提升的情况下才需要广告>> 类型截断。