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

しかし、定数を使用して小数を宣言する方法がわかりませんint。これは Q7 表記であるはずですが、なぜこのように行われるのでしょうか? また、コンパイラは小数である int をどのように受け入れるのでしょうか? それは単に分数の整数部分を取るのでしょうか?もしそうなら、なぜキャストが必要ないのですか?

4

2 に答える 2

3

浮動小数点値が整数に変換されると、切り捨てられます。つまり、小数点以下のすべての桁が単純に削除されます。と12.34なる1212.99 またとなる12。丸めは行われません。

これが+ 0.5、初期化でパーツが行うことです。これは単純に、丸めを使用して浮動小数点値を整数に変換する方法です。たとえば、切り捨てられた0.0299 * 128is はになります。しかし、切り捨てられた は になり、これはの丸められた値です。3.82723+ 0.54.327243.8272

ただし、まだ問題がある可能性があります。詳細については、すべてのコンピューター科学者が浮動小数点演算について知っておくべきことをお読みください。

于 2013-10-07T11:54:57.233 に答える