Daniel S. schrieb:
> mean^2 ist doch auch unabhängig von n. Also kann ich das doch aus der
> Summe rausziehen. Oder nicht?
Das stimmt schon, die verbleibende Summe ist dann aber die Summe aus n
Einsen und ergibt n. Du musst also mean² noch mit n multiplizieren. Dann
sollte die Formel stimmen.
Du sparst damit – wenn ich mich nicht verzählt habe – gegenüber der
Originalformel n-3 Additionen ein, brauchst dafür aber zusätzlich 3
Multiplikationen und 1 Division. Für große n fallen die paar
Multiplikationen und die Division gegenüber den gesparten n-3 Additionen
kaum noch ins Gewicht, so dass sich tatsächlich ein Rechenzeitvorteil
ergibt.
Dadurch, dass du an zwei Stellen durch n dividierst, ensteht bei
Verwendung von Integer-Arithmetik ein größerer Rundungsfehler als bei
der Originalformel. Aber vielleicht verwendest du wegen der Wurzel
ohnehin Floating-Point, dann ist der Unterschied vernachlässigbar.
Wenn man den Mittelwert nicht noch anderweitig benötigt, kann man dessen
Formel in die Gesamtformel einsetzen und das Ganze etwas vereinfachen:
Gegenüber deiner Lösung spart dies 2 Additionen, 1 Multiplikation und
1 Division ein und vermeidet den oben o.g. zusätzlichen Rundungsfehler.
Der Hauptvorteil deiner und meiner Formel liegt aber nicht so sehr in
der eingesparten Rechenzeit, sondern darin, dass man die n Messwerte
nicht in einem Array zwischenspeichern muss, wie es bei der
Originalformel der Fall ist, denn diese Zwischenspeicherung lässt bei
größerem n einen kleineren Controller RAM-mäßig schnell an seine Grenzen
stoßen.
Helmut S. schrieb:
> Vielleicht gibt es ja mit deiner Formel einen Überlauf.
Ja, das ist ein wichtiger Punkt. Ich habe das mal überschlägig
durchgerechnet:
Bei Daniels Formel liegt das größtmögliche Zwischenergebnis in der
Größenordnung von n·Umax², bei der Original- bzw. der von dir geposteten
Formel ebenso. Umax ist dabei die höchste vom ADC messbare Spannung.
Bei meiner Formel ist dein Argument allerdings nicht von der Hand zu
weisen, denn da ist das größtmögliche Zwischenergebnis n²·Umax² und
damit um den Faktor n größer. Wenn das ein Problem ist, kann man den
Faktor 1/n als 1/n² in die Wurzel hineinziehen, worunter aber die
Genauigkeit wieder etwas leidet.
Falls in Floating-Point gerechnet wird, sind weder Überläufe noch
Genauigkeit ein Problem, höchstens die Rechenzeit.