Hallo, wie kann ich in der Arduino IDE ein long mit einem float-Wert von 1.14 multiplizieren? long zahl; zahl = zahl * 1.14; Als Ergebniss sollte 114 herauskommen (als long, ganzzahlig)
T.M .. schrieb: > Hallo, > > wie kann ich in der Arduino IDE ein long mit einem float-Wert von 1.14 > multiplizieren? > > long zahl; > zahl = zahl * 1.14; > > Als Ergebniss sollte 114 herauskommen (als long, ganzzahlig) OMG Wie weit kann das Niveau denn noch sinken? Also das Arduino-System hat definitiv zumindest eine Sache geschaffen: Arduidioten...
T.M .. schrieb: > long zahl; > zahl = zahl * 1.14; > > Als Ergebniss sollte 114 herauskommen (als long, ganzzahlig) So kommt was undefiniertes raus, weil zahl nicht initialisiert wurde. Walter T. schrieb: >> zahl = zahl * 1.14; > > Fast. > zahl = 1.14 * zahl; Was soll da der Unterschied sein? Man kann auch einfach schreiben:
1 | zahl *= 1.14; |
Zu beachten ist allerdings, dass beim Ergebnis der Nachkomma-Teil einfach abgeschnitten wird. Es wird nicht gerundet. Walter T. schrieb: > Dauert aber. Und braucht viel Flash. Man sollte also überlegen, ob man nicht auch ohne float auskommt.
Wenn "zahl" nicht allzu hoch ist, hilft auch:
1 | zahl = zahl * 57 / 50 |
Hallo,
oh danke, ich sehe gerade in meinem Code einen Tippfehler hatte und das
ich 1,14 geschrieben hatte anstatt 1.14
..damit funktionierts dann :)
>Und braucht viel Flash. Man sollte also überlegen, ob man nicht auch ohne float
auskommt.
Ok, wäre das zB besser:
(zahl*114)/100
EDIT: sehe gerade dass oben schon ein Vorschlag kam
:
Bearbeitet durch User
Rolf M. schrieb: > Was soll da der Unterschied sein? Stimmt. Mein Fehler. Double promotion geht in beide Richtungen. Um genau zu sein: Doppelfehler. Richtig ist so:
1 | zahl = (1.14 + DBL_EPSILON) * 100; |
Wieso schneller? Einfach mal selbst den Assembler code anschauen...
Beitrag #6093964 wurde vom Autor gelöscht.
>(zahl*146)/128 Würde ich auch so machen. Wobei man es noch zu (zahl*73)/64 reduzieren könnte, was die Wahrscheinlichkeit eines Überlaufs etwas reduziert. oder ganz ohne Überlaufgefahr (in der Zwischenrechnung) (zahl / 8 ) + (zahl / 64) + zahl >Einfach mal selbst den Assembler code anschauen... Dann würde ich auch noch: (zahl*36)/256 + zahl anschauen. Hier wird ein ganzes Byte geschoben. Vielleicht effektiver.
T.M .. schrieb: > oh danke, ich sehe gerade in meinem Code einen Tippfehler hatte und das > ich 1,14 geschrieben hatte anstatt 1.14 Wenn Du
1 | long zahl{}; |
2 | zahl = zahl * 1, 14; |
schreibst, solltest Du eine Warnung bekommen, dass der rechte Operand des ,-Operators (Komma) keinen Effekt hat. Also: Du hast die Warnung ignoriert, was für Anfänger immer tragisch ist. Dein Code war damit identisch zu:
1 | long zahl{}; |
2 | (zahl = zahl * 1), 14; |
Und jetzt darfst Du auch mal nachdenken, was da passiert.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.