-
        

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 25

Thema: Ergebnis einer ungültiger Rechnung erkennen?

  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    18.03.2013
    Beiträge
    235

    Ergebnis einer ungültiger Rechnung erkennen?

    Anzeige

    Hallo,

    wenn ich mir eine float-Variable auf dem Seriellen Monitor ansehe, die aber aus einer nicht möglichen Rechnung, z.B acos (1.2) entstanden ist, wird als Wert "nan" ausgegeben.
    Wie kann ich diesen Wert, der ja kein float ist, in einem Arduino-Programm abfragen und als Fehler auswerten?

    Gruß
    fredyxx

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von i_make_it
    Registriert seit
    29.07.2008
    Ort
    Raum DA
    Alter
    49
    Beiträge
    2.437
    NAN (Not a Number) und INFINITY (unendlich) sind schon die Auswertung auf Fehler. eigentlich würde bei einem Fehler 0.00 angezeigt werden. Da weis man aber nicht ob das ein Fehler ist oder ob da ein gültiges Ergebnis 0,00 steht.

    Am besten also die selbe Auswertung machen die zur Anzeige von NAN führt.

    http://forum.arduino.cc/index.php?topic=46912.0

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    09.10.2014
    Beiträge
    2.431
    die Fehler muss man normalerweise vorher abfangen, indem man die Werte außerhalb der Definitionsbereiche der Funktion vorher ausschließt.

    z.B. bei
    Code:
    float x, y;
    y=1/x;
    Serial.print(y);

    muss es mathematisch und programmier-logisch richtig heißen:

    Code:
    float x, y;
    if(x!=0) {
       y=1/x;
       Serial.print(y);
    }
    else {
       Serial.print("ERROR! x=0 => NAN! Ungültiger Wertebereich!");
    }
    Genauso musst du deine x-Werte beim acos vorher prüfen und eingrenzen.

    Andere Programmiersprachen benutzen dafür eine Konstruktion wie
    try / catch / throw exception
    etc., die genau solche Fehler durch interne Routinen abfangen.

    In C geht das nicht, in C++ aber doch, ist aber nicht meine Baustelle.

    try catch throw exception C++:
    http://www.cplusplus.com/doc/tutorial/exceptions/
    http://www.tutorialspoint.com/cplusp...s_handling.htm
    ·±≠≡≈³αγελΔΣΩ∞ Schachroboter:www.youtube.com/watch?v=Cv-yzuebC7E Rasenmäher-Robot:www.youtube.com/watch?v=z7mqnaU_9A8

  4. #4
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    13.01.2014
    Beiträge
    398
    Blog-Einträge
    3
    Im Arduino-Kontext sind die C++ Exceptions ausgeschaltet, u.a. weil die Implementierung von Exceptions größere Programme produziert.

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    09.10.2014
    Beiträge
    2.431
    nur aus Interesse, C++ ist ja eh nicht mein Ding...
    Im Arduino-Kontext sind die C++ Exceptions ausgeschaltet, u.a. weil die Implementierung von Exceptions größere Programme produziert.
    tatsächlich? immer? oder nur bei AVRs?
    ·±≠≡≈³αγελΔΣΩ∞ Schachroboter:www.youtube.com/watch?v=Cv-yzuebC7E Rasenmäher-Robot:www.youtube.com/watch?v=z7mqnaU_9A8

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    27.08.2013
    Ort
    Region Basel
    Alter
    59
    Beiträge
    2.435
    Hallo fredyxx ,
    Zitat Zitat von fredyxx Beitrag anzeigen
    wenn ich mir eine float-Variable auf dem Seriellen Monitor ansehe, die aber aus einer nicht möglichen Rechnung, z.B acos (1.2) entstanden ist, wird als Wert "nan" ausgegeben.
    Wie kann ich diesen Wert, der ja kein float ist, in einem Arduino-Programm abfragen und als Fehler auswerten?
    Eigentlich sollte man VOR der Berechnung eine Plausibiltätsprüfung der Parameter vornehmen.
    Da muss irgend etwas schief gegangen sein, wenn z.B. ein Divisor 0 ist.

    Bei Ganzzahlrechnungen muss man auch aufpassen, dass Zwischenprodukte nicht überlaufen.

    Grundsätzlich sind Fliesskomma-Berechnungen langsam. Bei vorhandener FPU etwa 2-5 mal langsamer als Integer-Berechnungen. Muss die FPU emuliert werden, ist man etwa 100x langsamer als eine FPU. Hinzu kommt noch der Speicherplatz für die Bibliothek.

    In meinen µC-Projekten konnte ich FP immer umgehen, z.B. kann man Temperaturen in 1/100 Grad speichern, dann kann man alles mit Ganzzahlen berechnen und muss nur bei der Ausgabe das Komma reinflicken.
    Für gebrochene Zahlen kann man Brüche verwenden. Anstatt
    x*0.75 was FP benötigt
    Kann man
    (x*3)/4 rechnen, was dann mit Ganzzahlen geht. Aufpassen muss man nur, dass (x*3) keinen Überlauf erzeugt.

    Bei Seriengeräten kann dies dann einiges ausmachen, wenn man einen kleineren und günstigeren µC einsetzen kann.

    Auch komplizierte Berechnungen wie die Linearisierung eines NTCs und damit eines Feuchtesensors habe ich ganz ohne FP hin bekommen. OK, hat mich eine halben Tag Zeit gekostet um die Formeln entsprechend anzupassen, aber auf 1'000 Geräte umgelegt und beim µC gespart ...

    MfG Peter(TOO)
    Manchmal frage ich mich, wieso meine Generation Geräte ohne Simulation entwickeln konnte?

  7. #7
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    09.10.2014
    Beiträge
    2.431
    fredyxx ist Anfänger, aber wer sagt, dass er Geschwindigkeitsprobleme hat und nicht vlt sogar einen Arduino mit ARM-cpu hat, wo die float-Performance gar keine Rolle spielt?
    Aber das ist ja eigentlich auch OT, denn die Frage war ja der Umgang mit NANs.
    Und da braucht man entweder eine Programmiersprache, die die Fehler per Handles abfängt (C++ exceptions, geht aber wohl / ggf nicht bei Arduino) - oder man muss es korrekt selber machen, wie ich schon sagte:
    denn eine Funktion ist mathematisch immer nur auf einem bestimmten Wertebereich definiert, und der muss dann durch das eigene Programm eben eingrenzt werden (ungleich Null, größergleich Null, ungleich pi/2 oder pi/4, kleiner 1 oder was auch immer).
    ·±≠≡≈³αγελΔΣΩ∞ Schachroboter:www.youtube.com/watch?v=Cv-yzuebC7E Rasenmäher-Robot:www.youtube.com/watch?v=z7mqnaU_9A8

  8. #8
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    13.01.2014
    Beiträge
    398
    Blog-Einträge
    3
    Zitat Zitat von HaWe Beitrag anzeigen
    tatsächlich? immer? oder nur bei AVRs?
    So weit ich weiss gilt das für alle Arduinos, definitiv auch für z.B. den DUE.

  9. #9
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    09.10.2014
    Beiträge
    2.431
    ok, das ist mal wieder ne Einschränkung, die ziemlich dämlich ist, wenngleich sie auch mich nicht persönlich betrifft....
    ·±≠≡≈³αγελΔΣΩ∞ Schachroboter:www.youtube.com/watch?v=Cv-yzuebC7E Rasenmäher-Robot:www.youtube.com/watch?v=z7mqnaU_9A8

  10. #10
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    13.01.2014
    Beiträge
    398
    Blog-Einträge
    3
    Zitat Zitat von HaWe Beitrag anzeigen
    ok, das ist mal wieder ne Einschränkung, die ziemlich dämlich ist, wenngleich sie auch mich nicht persönlich betrifft....
    Exceptions sind defaultmäßig aus, weil sie normalerweise nicht gebraucht werden. Ansonsten rede mit dem Compiler, er lässt sich (mittels Flag) überreden.

Seite 1 von 3 123 LetzteLetzte

Ähnliche Themen

  1. Methoden zum Erkennen einer Fehlerbedingung in Microcontroller-Systemen
    Von Dirk im Forum Software, Algorithmen und KI
    Antworten: 23
    Letzter Beitrag: 24.03.2016, 21:01
  2. Sensor oder Schalter zum erkennen einer PokerKarte
    Von Andreas1984 im Forum Suche bestimmtes Bauteil bzw. Empfehlung
    Antworten: 1
    Letzter Beitrag: 25.12.2013, 02:17
  3. Division mit Nachkommastellen als Ergebnis???
    Von erik_wolfram im Forum C - Programmierung (GCC u.a.)
    Antworten: 3
    Letzter Beitrag: 22.08.2011, 17:13
  4. Beenden einer ISR erkennen
    Von hacker im Forum C - Programmierung (GCC u.a.)
    Antworten: 12
    Letzter Beitrag: 12.08.2009, 18:34
  5. Wie Abzweigung einer Linie erkennen?
    Von p_mork im Forum Software, Algorithmen und KI
    Antworten: 2
    Letzter Beitrag: 16.08.2007, 11:39

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •