2013-10-07 3 views
0

В программе, которая, кажется, работает хорошо у меня есть следующие объявления:Почему они могут быть объявлены целыми числами?

#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; 
} 

Но я не понимаю, как это possibl объявить дробное число, как int который делается с константами. Предполагается, что это нотация Q7, но почему это делается так, и как компилятор может принять int, который является дробным числом? Будет ли он просто принимать целую часть фракции, и если да, то почему это не требуется?

ответ

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

При переводе требуется только в случае тип продвижения нет в случае тип усечение.

Смежные вопросы