Forum: PC-Programmierung Long mit float multiplizieren


von T.M .. (max)


Lesenswert?

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)

von spontan (Gast)


Lesenswert?

const long zahl = 114;

von c-hater (Gast)


Lesenswert?

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...

von Walter T. (nicolas)


Lesenswert?

T.M .. schrieb:
> long zahl;
> zahl = zahl * 1.14;

Fast.
1
zahl = 1.14 * zahl;

Dauert aber.

von Rolf M. (rmagnus)


Lesenswert?

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.

von Mario M. (thelonging)


Lesenswert?

Wenn "zahl" nicht allzu hoch ist, hilft auch:
1
zahl = zahl * 57 / 50

von T.M .. (max)


Lesenswert?

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
von spontan (Gast)


Lesenswert?

Schneller, falls unsigned long möglich

(zahl*146)/128

von T.M .. (max)


Lesenswert?

Ja unsigned wäre möglich

von Walter T. (nicolas)


Lesenswert?

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;

von spontan (Gast)


Lesenswert?

Wieso schneller?
Einfach mal selbst den Assembler code anschauen...

Beitrag #6093964 wurde vom Autor gelöscht.
von JohannesL (Gast)


Lesenswert?

>(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.

von Wilhelm M. (wimalopaan)


Lesenswert?

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
Noch kein Account? Hier anmelden.