Forum: PC-Programmierung Long mit float multiplizieren


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.