Preprozessor round?

#3417686
Lesenswert?

Ich habe aus altem atmel code folgendes gefunden:
1
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden
2
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate
3
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD)

Scheinbar wird hier irgendwie gerundet, gibt es kein round() trunc() 
ceil() oder sowas gleich beim Preprozessor?

Ich möchte 12 / 5 = 2.4 das Ergebnis soll 2 sein.

Das Ergebnis soll immer abgerundet werden.

Gibt es da ne Preprozessor Lösung?
#3417705
Lesenswert?

David Mueller schrieb:
> Scheinbar wird hier irgendwie gerundet, gibt es kein round() trunc()
> ceil() oder sowas gleich beim Preprozessor?

Der C-Präprozessor kann nur int Ausdrücke berechnen und testen.
Wenn Du float Zahlen benutzt, funktioniert damit kein #if

Warum man ihn nicht schon längst auf float erweitert hat, weiß ich auch 
nicht. Damit ließe sich viel einfacher ein #error werfen, wenn eine 
berechnete Konstante außerhalb des erlaubten Bereichs ist.
Sonst sieht man es erst, wenn das Programm falsch läuft.
Gast #3420872
Lesenswert?

Peter II schrieb:
> David Mueller schrieb:
>> Gibt es da ne Preprozessor Lösung?
>
> bei int Rechenoperationen wird immer die Kommastelle abgeschnitten.

Das ist allerdings bei negativen Zahlen was anderes als immer 
abzurunden.

Peter Dannegger schrieb:
> Warum man ihn nicht schon längst auf float erweitert hat, weiß ich auch
> nicht.

Der Präprozessor kennt keine Datentypen. Man müßte also erstmal ein 
Typsystem im Präprozessor einführen, und das auch noch so, daß 
bestehender Code damit weiter funktioniert.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren