mikrocontroller.net

Forum: Compiler & IDEs Vorberechnen von Konstanten im Code, wie?


Autor: Tobias Z (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo allerseits,

mein Programm soll parametrisierbar sein und so berechne ich im Code 
einige Konstanten, was aber nicht so wie gewünscht funktioniert, siehe 
unten.
Wie kann ich solche Konstanten im Code beim Compilieren berechnen lassen 
und zwar mit der Genauigkeit des Computers, ohne über die Datentypen des 
Compilers gehen zu müssen? Da ich Werte im Bereich 10^-6 bis 10^6 in den 
Rechnungen drin hab', wär' das schon praktisch.

Danke vielmals!!  Tobias

______________________________

#define a 300

#define b 500

#define c (a*b) //könnte ich hier irgendwie schon rechnen lassen?

const unsigned long i=a*b; //i wird 18928 dezimal --> falsch
const unsigned long l=c; //dito (klar..)
const unsigned long k=((unsigned long)a*(unsigned long)b); //so stimmts

Autor: OliverSo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>über die Datentypen des Compilers gehen zu müssen?

Da der Compiler nunmal für dich rechnet (auch zur Compilezeit), wirst du 
dessen Datentype schon nutzen müssen. Die "Optimierung" durch 
Vorberechnung muß schließlich zum genau gleichen Ergenniss führen, wie 
eine Berechnung zur Laufzeit.

Konstanten lassen sich durch anhängen von "L" bzw "LL" als long oder 
longlong spezifizieren.
#define a 300L
Dann klappts auch mit der Berechnung.


Oliver

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eine "Konstante" wie

#define a 300

ist per se ein int. Damit ist eine Multiplikation zweier solcher 
Konstanten eine Multiplikation zweier ints, mit int -Ergebnis. Und 
das geht, wie Du festgestellt hast, auf einem 16-Bit-System in die Hose.

Durch Hintanstellen des Suffixes L kannst Du aber eine Konstante auch 
als long definieren:


#define a 300L

oder auch als unsigned long

#define a 300UL

Das sollte bei Deinem Problem helfen.

Autor: OliverSo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nachtrag: für unsigned nimmst du dann "UL".

Oliver

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