mikrocontroller.net

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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
const long zahl = 114;

von c-hater (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
-2 lesenswert
nicht lesenswert
T.M .. schrieb:
> long zahl;
> zahl = zahl * 1.14;

Fast.
zahl = 1.14 * zahl;

Dauert aber.

von Rolf M. (rmagnus)


Bewertung
1 lesenswert
nicht 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:
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)


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

von T.M .. (max)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Schneller, falls unsigned long möglich

(zahl*146)/128

von T.M .. (max)


Bewertung
0 lesenswert
nicht lesenswert
Ja unsigned wäre möglich

von Walter T. (nicolas)


Bewertung
0 lesenswert
nicht 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:
zahl = (1.14 + DBL_EPSILON) * 100;

von spontan (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Wieso schneller?
Einfach mal selbst den Assembler code anschauen...

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


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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
    long zahl{};
    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:
    long zahl{};
    (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]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [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.

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