asin() Merkwürdige Beobachtung

Gast #348307
Lesenswert?

Hallo Leute,
ich habe eine merkwürdige Verhaltensweise des asin() in meinem code
entdeckt. Wenn ich die Variablen (zwei float Werte jeweils zwei
verschiedene Werte die mittels asin() errechnet werden) global
definiere berechnet der asin() faltsch (einen sehr kleinen Wert mit
10E-36), definiere ich die Variablen lokal rechnet er richtig.
Wie könnte mann dieses Verhalten erklären?

Gruß
Efthi
Gast #348317
Lesenswert?

> //calculate a gravitation value
> fGraValueX = (fCountsX - 1024)/819;
> fGraValueY = (fCountsY - 1024)/819;

versuche hier mal statt 819 -> 819.0 zu schreiben. könnte sein, dass
keine umwandlung in float passiert, weil der wert (fCountsX - 1024) und
819 keine floats sind.
Gast #348318
Lesenswert?

Uuuaahhh. Horrorcode.

So kriegt man seinen Flash voll. Da wären z.B. die switch-statements,
die immer READ-CHANNEL zurückgeben. Der Wertebereich wird mit
if(fCountsX >= 1842) und if(fGraValueX>1) gleich doppelt überwacht.
Dann wird einer float-variablen natürlich ein float-wert zugeordnet,
der zuvor int und davor float war fDecimValueX = (int)fDecimValueX
(soll wohl im prinzip floor(x) sein). Dieser float-Wert wird nach int
gewandelt und wie folgt verarbeitet: iPhysValueX = fDecimValueX. Da
iPhysValueX nur innerhalb der Datei sichtbar ist, endet die Berechnung
hier im Nirvana.

Der Compiler wird dir wohl das alles wegoptimieren und dann bleibt eben
nichts übrig. Vielleicht wirds besser wenn du
extern int iPhysValueX, iPhysValueY;
schreibst.


Gruß
Marco
Gast #348319
Lesenswert?

<if(fCountsX >= 1842) und if(fGraValueX>1) gleich doppelt überwacht.>
Hast recht ist nicht nötig


<Dann wird einer float-variablen natürlich ein float-wert zugeordnet,
der zuvor int und davor float war fDecimValueX = (int)fDecimValueX
(soll wohl im prinzip floor(x) sein). Dieser float-Wert wird nach int
gewandelt und wie folgt verarbeitet: iPhysValueX = fDecimValueX. Da
iPhysValueX nur innerhalb der Datei sichtbar ist, endet die Berechnung
hier im Nirvana.>

Für die Berechnung des asin() benötige ich einen float Wert.
Die Variablen iPhysValueX und iPhysValueY werden weiter im CAN-stack
verarbeitet und da benötige ich nunmal int. Das ist nur ein c-file vom
ganzen Projekt.
Gast #348321
Lesenswert?

Wie durch extern im Kommentar angedeutet, gibt es wohl irgendwo in einem
anderem Programmmodul die int-Variable iPhysValueX.

/*--------------------------------------------------------------------*/
/*  external data
*/
/*--------------------------------------------------------------------*/
extern float fGraValueX, fGraValueY;
extern float fDecimValueX, fDecimValueY;
extern int iPhysValueX, iPhysValueY;

...

void mainVTI(){
 float fCountsX = (float)readsca (READ_X_CHANNEL_VTI);
 float fCountsY = (float)readsca (READ_Y_CHANNEL_VTI);

 fGraValueX = (fCountsX - 1024)/819;
 fGraValueY = (fCountsY - 1024)/819;

 if(fGraValueX>1)
   fGraValueX = 1;
 else if(fGraValueX<-1)
   fGraValueX = -1;

 if(fGraValueY>1)
   fGraValueY = 1;
 else if(fGraValueY<-1)
   fGraValueY = -1;

#if VTI_XY == 1
 CLI(); //disable all interrupts to avoid miscount
 fDecimValueX = asin(fGraValueX) * (180.0/M_PI); // calculates angle of
y-axis inclination
 fDecimValueX = fDecimValueX * 100;

 fDecimValueY = asin(fGraValueY) * (180.0/M_PI); // calculates angle of
x-axis inclination
 fDecimValueY = fDecimValueY *100;
 SEI();//re-enable interrupts

 iPhysValueX = (int) fDecimValueX;
 iPhysValueY = (int) fDecimValueY;

 CanOpenInterface();
#endif /* VTI_XY == 1 */
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren