Hallo, Ich arbeite testweise mit dem Visual Studio 2005 Ich habe folgenden 10 poligen IIR Filter mit 2 Koeffizienten.
1 | int main() |
2 | |
3 | {
|
4 | float koef1=0.92; //filter koeffizient 1 |
5 | float koef2=1-0.92; //Filter koeffizient 2 |
6 | |
7 | //zwischenspeicher
|
8 | static float fa_wert1=0; |
9 | static float fa_wert2=0; |
10 | static float fa_wert3=0; |
11 | static float fa_wert4=0; |
12 | static float fa_wert5=0; |
13 | static float fa_wert6=0; |
14 | static float fa_wert7=0; |
15 | static float fa_wert8=0; |
16 | static float fa_wert9=0; |
17 | static float fa_wert10=0; |
18 | |
19 | long e_wert=100000000; //eingagnswert |
20 | long fa_erg=0; //ergebnis |
21 | |
22 | for(;;) |
23 | {
|
24 | fa_wert1 = koef1 * fa_wert1 + koef2 * e_wert; |
25 | fa_wert2 = koef1 * fa_wert2 + koef2 * fa_wert1; |
26 | fa_wert3 = koef1 * fa_wert3 + koef2 * fa_wert2; |
27 | fa_wert4 = koef1 * fa_wert4 + koef2 * fa_wert3; |
28 | fa_wert5 = koef1 * fa_wert5 + koef2 * fa_wert4; |
29 | fa_wert6 = koef1 * fa_wert6 + koef2 * fa_wert5; |
30 | fa_wert7 = koef1 * fa_wert7 + koef2 * fa_wert6; |
31 | fa_wert8 = koef1 * fa_wert8 + koef2 * fa_wert7; |
32 | fa_wert9 = koef1 * fa_wert9 + koef2 * fa_wert8; |
33 | fa_wert10 = koef1 * fa_wert10 + koef2 * fa_wert9; |
34 | fa_erg = (long)fa_wert10; |
35 | printf("e=%d\n",fa_erg); |
36 | }
|
37 | }
|
Wenn ich nun als Eingangswert fest immer 100 000 000 nehme kommt das Ergebnis nie an 100 Millionen ran sondern bleibt fest bei 99 999 760. Ich denke das liegt an der Ungenauigkeit von Float. Frage 1 kann mir hierzu jemand mehr sagen? Wenn ich dasselbe mit dem CC-Studio und einem DSP von TI (TMS320f2812) mache, erhalte ich nie mehr als 99 999 048 Diese Ungenauigkeit ist mir einfach zu groß. Laut Datenblatt arbeitet der TI Prozessor nach IEEE 32 Bit Frage 2 Ich denke Visual Studio doch sicher auch oder? Frage 3 Warum dann die großen Unterschiede? Frage 4 kann ich die ungenauigkeit durch kompiler einstellungen verringern oder bleibt mir nur der weg über „long double“ was aber einfach viel zu lange dauert bis er die Rechnung gemacht hat. Vielen dank für eure Antworten