Wenn dein Problem oder deine Frage geklärt worden ist, markiere den Beitrag als "Lösung",
indem du auf den "Lösung" Button rechts unter dem entsprechenden Beitrag klickst. Vielen Dank!
18.03.2013, 10:46 (Dieser Beitrag wurde zuletzt bearbeitet: 18.03.2013 10:49 von myth.)
ich hab ein kleines Problem mit der Abbruchbedingung einer While-Schleife. In dem Programm wird eine Anfangsspannung, ein Inkrement und eine Endspannung eingegeben. Ziel ist es die Spannung langsam hochzuregeln und den Strom zu messen, bis die Endspannung erreicht ist.
Hier ein Beispiel:
Anfangsspannung: 0,00V
Inkrement: 0,20V
Endspannung: 2,00V
du vergleichst Gleitkommazahlen! 10 mal 0,2 inkrementiert ist für den Computer nicht unbedingt EXAKT 2,0, sondern vermutlich irgendeine Zahl in der Nähe (z.B. 1,99999999295127 oder auch 2,00000000001253 o.ä.).
Dementsprechend muss man bei solchen Vergleichen aufpassen, da genau diese wie von dir beobachteten Phänomene entstehen. Wenn du als Zielspannung 1,99 bzw. 2,99 eingibst, beendet dein Programm bei 2V bzw. 3V.
..und die Lösung wäre: Zur "Endspannung" vor dem Vergleich noch 0.001 addieren. Wenn Du dann als Anfansgspannung, Inkrement und Endspannung immer Werte mit nicht mehr als 2 Stellen nach dem Komma eingibst, können solche Zufälligkeiten überhaupt nicht mehr passieren.
Ich persönlich würds ja vermutlich einfach in mV darstellen und dann I32 benutzen ^^
Spart man sich den Stress mit den Gleitkommazahlen.
Zitat:Märchen und Geschichten werden erzählt am Lagerfeuer, technischen Fakten werden mitgeteilt (oder so). (Genauso wie Software nicht auf einem Server "herumliegt", die ist dort installiert.)
*Zitat: IchSelbst*
Anzeige
21.03.2013, 15:34 (Dieser Beitrag wurde zuletzt bearbeitet: 21.03.2013 15:35 von Lucki.)
Wichtig ist vor allem zu wissen, was man will.
Beispiel: Bereich 0..10, Schrittweite 3
Bereichsende ist 10, Schritte um diesen Wert herum sind 9 und 12.
Wenn, wie hier, das Bereichsende selbst kein Schrittwert ist, will man dann, dass der letzte Schritt innerhalb oder außerhalb des Bereiches liegt? Beides lässt sich machen (endweder vor oder nach dem Inkrementieren die Bedingung abfragen).
Und wie man am Beispiel sieht, wird man diese Entscheidung auch bei Verwendung von ganzen Zahlen nicht automatisch los. Der "Stress" des Entscheiden müssen bleibt also bestehen.
Oder will man stattdessen als letzten Wert immer 10V messen. ^^ (das entsprechende Bereichsende)
Entsprechend angepasst muss die Auswertung sein. Trotzdem dürfte das verwenden von Integers das etwas erleichtern (da man tatsächlich auf Gleichheit oder größer / kleiner prüfen kann).
Alternativ sollte man bei Real Zahlen entsprechend Gleichheit über Differenzbildung und Betragsbildung und dann Prüfung auf kleiner als ein Schwellwert, zum Beispiel wie weiter oben angemerkt 0,0001) durchführen. Das sollte in aller Regel die Rundungsfehler beim übertragen von "exakten" Zahlen von Dez nach Binär übersteigen.
Zitat:Märchen und Geschichten werden erzählt am Lagerfeuer, technischen Fakten werden mitgeteilt (oder so). (Genauso wie Software nicht auf einem Server "herumliegt", die ist dort installiert.)
*Zitat: IchSelbst*
21.03.2013, 19:37 (Dieser Beitrag wurde zuletzt bearbeitet: 21.03.2013 19:38 von Lucki.)
(21.03.2013 16:50 )Kiesch schrieb: Oder will man stattdessen als letzten Wert immer 10V messen. ^^ (das entsprechende Bereichsende)
Dann würde ich das so machen: Nicht Eingabe von:
Anfang, Ende, Schrittweite
sondern:
Anfang, Ende, Anzahl_Samples
Schrittweite wird berechnet, das können dann (bei ungeschickten Vorgaben) allerdings krumme Werte mit vielen Dezimalstellen nach dem Komma sein.
Die Rampenfunktion macht genau das, und die wäre meine erste Wahl. Erzeugt ein fertiges Array, statt While-Schliefe + Abbruchprüfung bei jedem Durchlauf braucht man nur noch eine For-Schleife mit Indexeingang - wenn überhaupt. Das ganze Gedöns wie die Schleife beenden wird hinfällig.