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)
Gast
#6093926
const long zahl = 114;
Gast
#6093932
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 | |
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 | |
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
Gast
#6093949
Schneller, falls unsigned long möglich (zahl*146)/128
Ja unsigned wäre möglich
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 | |
Gast
#6093960
Wieso schneller? Einfach mal selbst den Assembler code anschauen...
Beitrag #6093964 wurde von einem Moderator gelöscht.
Gast
#6093993
>(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 | |
2 | |
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 | |
2 | |
Und jetzt darfst Du auch mal nachdenken, was da passiert.
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.