Forum: Compiler & IDEs Preprozessor round?


von David H. (davidm)


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?

: Bearbeitet durch User
von Peter II (Gast)


Lesenswert?

David Mueller schrieb:
> Gibt es da ne Preprozessor Lösung?

bei int Rechenoperationen wird immer die Kommastelle abgeschnitten. Da 
braucht man nicht runden.


12 / 5 ist also 2

von David H. (davidm)


Lesenswert?

1
 #define CB         (UINT32) ((63.2) / 8)

Das Ergebnis hier ist 7.9 und am ende 7

Fraglich nur ob das Zufall ist oder ob das wirklich immer so ist.

Gibt es den funktionen zum Runden?

von Peter II (Gast)


Lesenswert?

David Mueller schrieb:
> Fraglich nur ob das Zufall ist oder ob das wirklich immer so ist.

das ist immer so, weil es C ist und so definiert ist.

> Gibt es den funktionen zum Runden?
du willst ja nicht runden.

von Peter D. (peda)


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.

von (prx) A. K. (prx)


Lesenswert?

Peter Dannegger schrieb:
> Der C-Präprozessor kann nur int Ausdrücke berechnen und testen.

Um dem üblichen Missverständnis vorzubeugen: In diesem Kontext kann der 
C-Präprozessor überhaupt nicht rechnen. Rechnen tut hier der Compiler.

Der C-Präprozessor rechnet ausschliesslich in der Bedingung des #if 
Statements. Sonst nirgends.

: Bearbeitet durch User
von (prx) A. K. (prx)


Lesenswert?

Peter Dannegger schrieb:
> Warum man ihn nicht schon längst auf float erweitert hat, weiß ich auch
> nicht. Damit ließe sich viel einfacher ein #error werfen,

Der Präprozessor ist bei den Sprachschaffenden nicht so richtig beliebt 
- vorsichtig ausgedrückt. Weshalb wesentliche Erweiterungen nicht zu 
erwarten sind. C++11 enthält eigens dafür ein static_assert.

von Simon K. (simon) Benutzerseite


Lesenswert?

#define DIVIDE_N_ROUND(X,Y) ( ((X)+(Y)/2) / (Y) )

So?

: Bearbeitet durch User
von Rolf Magnus (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.