guten moin, habe nicht viel ahnung vom programmieren, deshalb folgendes problem: ich nehme über einen ad-wandler einen wert x auf. (das klappt) nun möchte ich damit ein wenig rechnen. und zwar: der wert von x soll in der formel (siehe unten) eingesetzt werden. diese funktion soll in der endlosscheleife solange mit sich selbst addiert werden, bis der wert von y > 1 ist. wie kann ich das am besten realisieren? besonders die potenzen von x machen mir zu schaffen. meine paar code-fragmente sehen so aus: x ist global definiert. in x steht immer der aktuell gemessene wert. main() { double y=0; for(;;) { y += 3E-09*(x*x*x) - 2E-03*(x*x) + 4E-04*(x) + 1E-07; if (y>1){...} } } kann das so funktionieren? brauch ich ne neue header-datei? gibt es evtl. ne stilistisch schönere variante? :-) besten dank schon einmal im voraus
welchen µC verwendest du den? bei einem 8bitter wirds mit double lustig ;)
also x*x kanst du doch shconmal rausziehn udn brauchst das nur einmal zu berechnen: for(;;) { z = x*x y += 3E-09*(z*x) - 2E-03*(z) + 4E-04*(x) + 1E-07; if (y>1){...} } } wenn sich x innerhalb der For Schleife nie ändert kannst du das sogar komplett VOR die schleife ziehen, und nur immer eine konstante auf y addieren.
jau stimmt. ist wohl wirklich einfacher, das x rauszuholen. danke schön :-) aber, wenn noch wer eine gute idee hat... immer her damit!!!
Ist doch egal, schreib die Fnnktion in C und gut is. Die Berechnung dauert bei Double zwar lange aber wenn Zeit kein Problem darstellt, ist doch alles bestens.
y=0; while (y<=1) y += 3E-09*(z*x) - 2E-03*(z) + 4E-04*(x) + 1E-07;
Man kann auch bestimmt noch ausklammern/Vereinfachen... aber das sit eher ein Fall für die MAthematisch bewanderten Tüftler :)
Ausklammerungen y += 3E-09*(x*x*x) - 2E-03*(x*x) + 4E-04*(x) + 1E-07; Das Orginal enthält 6 Multiplikationen z = x*x y += 3E-09*(z*x) - 2E-03*(z) + 4E-04*(x) + 1E-07; Die verbesserte Variante 5 Multiplikationen: Notwendig sind aber nur 3 Multiplikationen: y += ((3E-09*x) - 2E-03)*x + 4E-04)*x + 1E-07; Man muß die Berechnung doch nicht unnötig kompliziert machen ;-) Ansonsten gilt die erste Regel der Optimierung: * es wird nicht optimiert
> Ansonsten gilt die erste Regel der Optimierung: > * es wird nicht optimiert Dann gibts noch: * Optimierungen, die man durch stundenlanges Finetuning einbaut, haben keinen nennenswerten Effekt außer einer Verschlechterung der Lesbarkeit. * Dinge, die man nicht für optimierenswert hält, enthalten meist gewaltiges Optimierungspotenzial.
Deshalb noch eine Optimierungsregel: * ohne Performance-Messung wird nicht optimiert
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.