Forum: Mikrocontroller und Digitale Elektronik funktionsberechnung 3. ordnung???


von schlunz (Gast)


Lesenswert?

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

von chriss chd (Gast)


Lesenswert?

welchen µC verwendest du den? bei einem 8bitter wirds mit double lustig
;)

von schlunz (Gast)


Lesenswert?

ne ist nen 16bittiger von freescale

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

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.

von schlunz (Gast)


Lesenswert?

jau stimmt. ist wohl wirklich einfacher, das x rauszuholen.
danke schön :-)
aber, wenn noch wer eine gute idee hat... immer her damit!!!

von Jens (Gast)


Lesenswert?

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.

von Fritz G. (fritzg)


Lesenswert?

y=0;

while (y<=1)
  y += 3E-09*(z*x) - 2E-03*(z) + 4E-04*(x) + 1E-07;

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Man kann auch bestimmt noch ausklammern/Vereinfachen... aber das sit
eher ein Fall für die MAthematisch bewanderten Tüftler :)

von Werner Hoch (Gast)


Lesenswert?

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

von Rolf Magnus (Gast)


Lesenswert?

> 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.

von Werner Hoch (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.