1 | #include <math.h> |
2 | |
3 | float f; |
4 | f = 356.1398; |
5 | f = cos(f); |
Wieso kommt hierbei -0.4177479 raus und nicht die erwarteten 0.997 ?
|
|
Forum: Mikrocontroller und Digitale Elektronik Microchip PIC24 cos() function
Wieso kommt hierbei -0.4177479 raus und nicht die erwarteten 0.997 ? Simon schrieb: > #include <math.h> > > float f; > f = 356.1398; > f = cos(f); > > Wieso kommt hierbei -0.4177479 raus und nicht die erwarteten 0.997 ? Weil es das korrekte Ergebnis ist. Stichwort: Bogenmaß. Das Ergebnis ist korrekt. sin und cos erwarten ein Winkel in rad, nicht in °. Du musst also den Winkel zunächst umrechnen. Simon schrieb: > Wieso kommt hierbei -0.4177479 raus und nicht die erwarteten 0.997 ? weil Computer allgemein nicht mit grad sondern mit radians arbeiten. Gibt es da ein einfachen weg um das umzurechnen? Folgendes soll berechnet werden: Vielleicht das man das irgendwie auch optimiert und keine math.h braucht
Simon schrieb: > Folgendes soll berechnet werden: > Vielleicht das man das irgendwie auch optimiert und keine math.h braucht feste Tabelle: f sollte auch kein float sein und in einen überschaubaren Wertebereich liegen. word costab[] = {0,2,3,4,65,76,78,98,9, .... } w = costab[f]; Die Multiplikation f *= 0.0703; kann ich lassen wie gewohnt? eventuell kann man das ja aufbohren auf 703 so hat man dann ein höheren wert. Nur da kommt auch ein anderes cos() ergebnis raus. Wie funktioniert das mit der Tabelle genau? welche werte werden da vorher abgelegt? Simon schrieb: > Wie funktioniert das mit der Tabelle genau? welche werte werden da > vorher abgelegt? sinnvoller weise die cos werte. Das ist doch dir überlassen, es ist einfach eine Tabelle die aus einem wert einen anderen macht also eine Vorberechnung. Wenn bei dir nur ein paar hundert Winkel möglich sind, dann kann man für diese Winkel sich einfach vorher die Daten berechnen. BeastyK schrieb: > Moin Simon, > > schau dir auch mal den Link an: > > Beitrag "Winkelberechnung mit PIC" Hier gehts um einen PIC24, 16 Bit 16MHz oder mehr, da macht man keine Klimmzüge (da war ein IBM AT viel langsamer). MfG Klaus Es geht um die Berechnung von einem versatz zwischen Spannung und strom. also sprich dem cos(phi) im Wechselstromnetz. Ich bekomme von einem chip den Wert geliefert. Als 16Bit WORD, z.B. ebend 5066 und möchte das auf einen Winkel Umrechnen. Ich bin mir also nicht sicher ob das mit so einer Tabelle ausreichend genau ist. Vorallem wie groß soll die Tabelle den sein? Ich spare mir damit CPU leistung zu lasten von Speicher. Simon schrieb: > Ich spare mir damit CPU leistung zu lasten von Speicher. Für nicht benutzte CPU Takte gibt es keine Rückvergütung. Wenn es also gerechnet schnell genug ist, ist alles gut. MfG Klaus Simon schrieb: > Als 16Bit WORD, z.B. ebend 5066 und möchte das auf einen Winkel > Umrechnen. und was ist der wert 5066? > Ich spare mir damit CPU leistung zu lasten von Speicher. genau das ist der Sinn einer Tabelle. Klaus schrieb: > Für nicht benutzte CPU Takte gibt es keine Rückvergütung. für nicht genutzten Flash auch nicht. außerdem wollte er ja scheinbar nicht rechnen: > keine math.h braucht Die gesuchte funktion waere dann arccos. Wie genau muss es an denn sein? Bitte keinen 0.1 Grad Furz... Also rauskommen soll ein WORD, also wenn cos phi 0.99 ist könnte ich gut mit 99 leben z.B. Simon schrieb: > Also rauskommen soll ein WORD, also wenn cos phi 0.99 ist könnte ich gut > mit > 99 leben z.B. 99 was? ein cos phi 0,99 sind doch keine 99Grad Phasenverschiebung. Peter II schrieb: > ein cos phi 0,99 sind doch keine 99Grad Phasenverschiebung. Nein nein, ich hätte es nur *100 genommen um es in ein WORD ohne komma zu bekommen also die 99 würden 0.99 entsprechen und welchen Wert bekommst du extern rein? Wird doch wohl kein float sein? Wie ist diese Wertebreich definiert? Simon schrieb: > Ich bekomme von einem chip den Wert geliefert. > > Als 16Bit WORD, z.B. ebend 5066 und möchte das auf einen Winkel > Umrechnen. Das ist der Schlüssel. Was liefert der Chip? Bananen? RAD? Was sagt das Datenblatt zum "Chip"? Weshalb braucht man denn einen Gradwert ? Meist kann man mit proportionalen Werten weiterrechnen. Dh 2345 ist ebensogut wie 89, meist eher schneller und genauer. Ich rechne nur fuer Benutzerinteraktionen auf Bentuzerwerte wie Grad-winkel, oder Grad-Celsius um, die Rechnungen sind in integer, meist Longint. Also das was er ausgibt ist ebend dieser 16 Bit wert 5066 z.B. Der wird anhand der formel unten berechnet Also alles Integer. 703 mal den Registerwert und das Komma an die richtige Stelle... ...Fertig. War wohl etwas voreilig. Das ist dann erst der Phasenwinkel. Davon brauchts dann noch den cos. Würde ich als Tabelle mit 000 bis 100 für cos Phi anlegen und dem Registerwert als Index. hp-freund schrieb: > Also alles Integer. > 703 mal den Registerwert und das Komma an die richtige Stelle... Willst du mir damit sagen, ich hab so nen aufriss gemacht, obwohl es so leicht hätte sein können. oh man Nein, sorry hatte erst den Phasenwinkel im Hinterkopf. Du willst aber den cos davon. Ich habs gerade bemerkt, ja das ergebnis stimmt schon, aber ebend erspart mir das den cos() nicht Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.
|
|