- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 7 von 7

Thema: Rechnet der Arduino Falsch?

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1

    Rechnet der Arduino Falsch?

    Hallo,
    ich will mit einem Joystick einen Roboter steuern. Dabei soll der Joystick sagen, welcher Motor (rechts, links) wie schnell fahren soll.
    Auf jeden Fall muss ich dafür folgendes Rechnen:

    geschwindigkeit_links = wert_y_map;
    double geschw_rechts = 0;
    geschw_rechts = (((-100 - (-83)) / (-100)) * 253);


    Bei dieser Rechnung kommt doch tatsächlich 0 "für geschw_rechts" heraus!

    Ich verstehe nicht! Double ist doch für kommazahlen gedacht! Wenn ich diese Rechnung in den Taschenrechner eingeben (genau so auch mit klammern) dann kommt 43.01 heraus! was rechnet der Arduino micro da?

    Vielen Dank schon mal im vorraus!

  2. #2
    Unregistriert
    Gast
    Zitat Zitat von RoboterSindCool Beitrag anzeigen
    geschw_rechts = (((-100 - (-83)) / (-100)) * 253);

    Ich verstehe nicht! Double ist doch für kommazahlen gedacht!
    Rechts vom Gleichheitszeichen stehen aber nur Integer. Hänge mal an einer oder allen Zahlen ein .0 dran, also zB -100.0

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    27.08.2013
    Ort
    Region Basel
    Alter
    66
    Beiträge
    2.435
    Hallo,

    Der rechnet:

    -100 - -83 = -17
    -17 / -100 = 0.17 als Integer ergibt dies = 0 !!

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

  4. #4
    Unregistriert
    Gast
    exakt, C rechnet immer nur mit der minimal notwendigen Genauigkeit, das ist bei reinen Int Zahlen eben reine Int Arithmetik.
    Nur wenn verschiedene Datentypen in derselben Kalkulation auftauchen, wird automatisch auf die "höhere" gecastet.
    100 ist Int, während 100.0 fp ist.

    Also ist 17/100 per Int-Arithmetik 0 (Null) , während 17/100.0 automatisch auf fp gecastet wird, also als Ergebnis 0.17 ergibt.
    Oder man muss explizit casten:
    (float)17 / (float)100 = 0.17

    Und davon ab, auf dem Arduino Micro ist double auch gar kein double sondern nur float.

  5. #5
    Hi und vielen vielen Dank für die schnellen Antworten!

    Wenn ich es so rechne funktioniert es : geschw_rechts = (((-100.00 - (-83)) / (-100)) * 253);

    also einfach hinter eine Zahl ".00" anfügen für float.

    Vielen Dank

  6. #6
    Erfahrener Benutzer Robotik Einstein Avatar von Geistesblitz
    Registriert seit
    16.03.2011
    Ort
    Dresden
    Alter
    37
    Beiträge
    1.937
    Mal ganz davon ab, dass deine Formel ziemlich umständlich geschrieben ist. Besser wäre wohl sowas:
    geschw_rechts = (100-83)*253/100.00;

    Ist genau dasselbe, nur ohne die ganzen Vorzeichen. Ich weiß jetzt nicht, ob der erste Teil noch mit Integer gerechnet wird und das Ergebnis dann beim Teilen durch 100.00 erst in Float umgewandelt, jedenfalls würde es so effizienter gerechnet werden. Aber zumindest finde ich es so übersichtlicher. Achja, sind das alles feste Zahlen oder werden Teile davon mal durch Variablen ersetzt werden? Dann wäre es sinnvoll, alle konstanten Werte zu einer Konstanten zusammenzufassen, die dann nur abgerufen werden muss.
    AI - Artificial Idiocy

  7. #7
    Unregistriert
    Gast
    es ist nicht ungefährlich, bei Variablen zunächst alle Int Werte miteinander zu multiplizieren, bevor man dividiert.
    In diesem Falle mag es gehene, wenn die Werte aber anders aussehen, gibt's Ärger:
    Mal mit etwas anderen (größeren) Zahlen:

    (1000-87)*253/100.0

    ergibt zunächst
    913
    * 253
    => => Speicherüberlauf,
    da Int nur von -32768 bis 32767 gehen (Int-Arithmetik !),
    und dann führt auch eine anschließende Division /100.0 zu nichts sinnvollerem.

    Wenn man also den Wertebereich der Rechnung nicht für alle möglichen Fälle sicher überschauen und von vornherein eingrenzen kann, ist ein rechtzeitiges Typecasting nach float der einzig sichere Ausweg,
    d.h. Konstanten als floats schreiben mit Dezimalpunkt oder Int-Variablen per (float) vorher explizit casten, bevor man mit ihnen weiter herumrechnet.

Ähnliche Themen

  1. schon mal festgestellt? A. Due rechnet falsch - Mega ok!
    Von HaWe im Forum Arduino -Plattform
    Antworten: 47
    Letzter Beitrag: 21.11.2014, 22:27
  2. RN-Control rechnet nicht Richtig
    Von robonooby im Forum Schaltungen und Boards der Projektseite Mikrocontroller-Elektronik.de
    Antworten: 2
    Letzter Beitrag: 19.03.2011, 17:04
  3. Antworten: 5
    Letzter Beitrag: 07.08.2008, 17:38
  4. Wie rechnet man GPS Koordinaten in Meter um (NMEA)?
    Von Fourstroker im Forum Software, Algorithmen und KI
    Antworten: 1
    Letzter Beitrag: 25.01.2006, 13:32
  5. Rechnet der AVR falsch oder bin in ich nur zu dumm ?
    Von NumberFive im Forum C - Programmierung (GCC u.a.)
    Antworten: 9
    Letzter Beitrag: 11.02.2005, 14:35

Stichworte

Berechtigungen

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

Labornetzteil AliExpress