PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : gelöst: sin(90)=0 ?!



panzerkeks
23.02.2008, 09:04
Hallo Miteinander

ich bin dabei, ein Programm zu schreiben, das den Roboter irgendwann mal automatisch an seine Ladestation ankoppeln soll.

Als ersten schritt dachte ich mir, lasse ich den Roboter mithilfe von Polarkoordinaten (x, y aus Drehung und gefahrener Strecke) seine Position bestimmen, um später den Rückweg zu finden.

Nun zu meinem Problem: um die Koordinaten zu berechnen benötige ich die Sinus und Kosinus-funktion - theoretisch sind diese ja in math.h enthalten...

Doch: auf dem RP6 ist sin(90) = 0! (Normalerweise sollte ja sin(90) gleich 1 sein)
auch sin(45), sin (10), sin(1) und sin(0) sind 0...

PN gibt aus:
warning: implicit declaration of function 'sin'
warning: incompatible implicit declaration of built-in function 'sin'
warning: implicit declaration of function 'cos'
warning: incompatible implicit declaration of built-in function 'cos'

Wie kann ich die sin bzw cos Funktion auf dem RP6 benutzen?

mfg pk

zerush
23.02.2008, 09:26
Also auf jeden Fall wird die Funktion nicht gefunden!
Daher wohl auch die 0.

Hast du denn #include <math.h> in deinem Programm stehen?

Martin.
23.02.2008, 10:38
In C und Delphi musst du die Winkel im Bogenmaß angeben.

Also b = alpha / 180° * pi

Wird vielleicht da auch der Fall sein!

Felix G
23.02.2008, 10:58
Dann würde die Funktion nicht immer 0 liefern, sondern falsche, aber (bei den als Beispiel genannten Zahlen) unterschiedliche Werte


Die Warnungen sprechen in diesem Fall für sich...
die Funktion wird einfach nicht gefunden.

panzerkeks
23.02.2008, 11:03
Ups, hatte math.h tatsächlich nicht included ](*,)

Jetzt zwar keine Fehlermeldung mehr, gibt allerdings hartnäckig weiter 0 aus (Auch mit Bogenmaß)

SlyD
23.02.2008, 11:30
Hallo,

Ich kann es gerade nicht testen, aber probier mal

double x = 1;
und dann erst
sin(x)
Oder halt nach double casten mit sin((double)x).


Fließkommazahlen kannst Du auch nicht mit writeInteger ausgeben (sagt ja der Name schon - "schreibGanzeZahl").

Da musst Du dtostrf nehmen
http://www.nongnu.org/avr-libc/user-manual/group__avr__stdlib.html#g6c140bdd3b9bd740a14901373 17caa44
um das in ein char array reinzuschreiben
und anschließend mit writeString() ausgeben.

MfG,
SlyD

panzerkeks
23.02.2008, 21:24
double a = (90/180)*3.14159;

double b = sin((double) a);

char* c = "";
dtostrf(b, 10, 3, c);

writeString(c);
writeString_P("\n");


gibt mir aus: " 0.000"

panzerkeks
23.02.2008, 22:15
Habe herausgefunden: (90/180)*3.14159 = 0...
Wenn ich a = 1.5 setze, kommt für sin(a) sogar 0.997 heraus :cheesy:

Wieso gibt 90/180 denn 0 bitte? :-s

izaseba
23.02.2008, 22:26
Wieso gibt 90/180 denn 0 bitte?

Ist doch einfach (90/180) wir standardmäßig in int durchgeführt,
versuche es mal so:


double a = ((double)90/180)*3.14159;

Gruß Sebastian

panzerkeks
23.02.2008, 22:33
Ja das funktioniert! vielen Dank an alle!

radbruch
23.02.2008, 22:48
Danke auch von mir, ein sehr infomativer Thread.