www.mikrocontroller.net

Forum: Compiler & IDEs Dividieren in GCC


Autor: Werner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
vielleicht ne blöde Frage, aber ich komm nich drauf.
Ich möchte einer Konstanten (oder auch einer Variablen) einen vom
Compiler berechneten Wert zuweisen. Leider ist mir nicht klar, wie ich
denn teilen muss, das eine float Zahl raus kommt.
Mit der normalen Division kommt ja immer nur der ganzzahlige Anteil
raus.

Beispiel:
#define ADC_REF   4920L
adc_val *= ((ADC_REF/1024);
// -> multipliziert nur mit 4
//soll aber mit 4.804 multiplizieren


Am liebsten würde ich ja schon eine Konstante ala
#define ADC_Cor  ADC_REF/1024
machen, das klappt aber auch nicht.

Bitte nicht schimpfen, ich fang gerade erst mit C an.

Autor: OldBug (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hm, ich hätte gedacht, daß das gar nicht erst Funktioniert, habe es aber
mal auf dem PC mit MinGW ausprobiert.

#include <stdlib.h>

#define ADC_REF 4920.0

int
main(void)
{
    printf("Value=%f\n", (ADC_REF / 1024.0));

    return 0;
}

Ergebnis:

Value=4.804688

...keine Garantie, daß das auch auf anderen Targets Funktioniert, aber
kannst es ja mal ausprobieren...

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie hier dividiert wird, hat nichts mit dem Target zu tun, sondern wie
die Konstanten definiert sind:

Werner rechnet mit int-Werten:

#define ADC_REF   4920L  (das Suffix L ist hier irrelevant)

adc_val *= ((ADC_REF/1024);

Die Klammer enthält die Division zweier Int-Werte, das wird vom
Compiler also durch einen Int-Wert ersetzt.

Der Ansatz von Oldbug rechnet mit float-Werten:

#define ADC_REF   4920.0
adc_val *= ((ADC_REF/1024.0);

Hier enthält der Ausdruck in der Klammer die Division zweier
float-Werte, die vom Compiler durch das float-Resultat ersetzt wird.


Merke: Beim Verwenden von Konstanten auf den Typ achten!#

1024 ist eine Int-Konstante,
1024.0 ist eine float-Konstante

Autor: OldBug (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Richtig!
Aber ich war bisher der Ansicht, daß der Präprozessor "float"
überhaupt nicht unterstützt. Das ist wohl offensichtlich eine Falsche
Annahme.
Letztens haben wir darüber diskutiert, in welchem Typen der
Präprozessor überhaupt rechnet. Dabei kam von jemandem, der wohl im
"man" geblättert hat, die Aussage "HOST_LARGEST_INT", was ja
offensichtlich kein float ist.
Naja, vielleicht kann das ja jemand anders aufklären :-)

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Präprozessor macht das nicht, der rechnet nicht.
Der ist nur dafür zuständig, den Text "ADC_REF" durch den Text
"1024.0" zu ersetzen.

Das Rechnen erledigt der Compiler.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
C-Konstanten:

int:

#define ik 12345


long:

#define lk 12345L


float:

#define fk 12345.0


auch nur ein int:

#define ik2 ((int)(fk / 3.3 + 0.5))


Peter

Autor: C-Programmierer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Genau genommen ist "123.45" kein float, sondern ein double.
"123.45f" wäre ein float.
Compiler für Mikrocontroller scheinen aber wohl nicht zwischen double
und float zu unterscheiden (zumindest von der Datengröße, von der
Syntax her müssen sie es).

Autor: Werner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Angeregt von den Beiträgen habe ich einfach mal probiert das ganze zu
casten.

#define ADC_REF    4920
#define ADC_COR  (float)ADC_REF/1024

das funktioniert auch. Die Codegröße ist identisch mit der vorher.

Danke für die Anregungen.
Werner

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.