Danke für die schnellen Antworten!
A. K. schrieb:
> Wobei man aber heute oft drauf setzen kann, dass der Compiler konstante
> Ausdrücke erkennt und zur Übersetzungszeit optimiert. Man also oftmals
> arithmetischen Fragen ganz normal in C formulieren kann.
ah8 schrieb:
> Warum muss es denn unbedingt eine Zweipotenz sein? Das muss ja seinen
> Grund haben, damit irgendetwas funktioniert. Vielleicht kann man
> versuchen, dass in einem assert nachzubilden? Wenn es keinen Fehler
> gibt, war es eine Zweierpotenz.
>
> Oder man geht andersherum an die Sache heran:
> #define BZ(e) (1<<(e))
>
> Das ist garantiert eine Zweierpotenz.
Genau das habe ich vor. Ich habe vor einen (konstanten) Faktor als Bruch
zu definieren, damit der Compiler eine Division in Shifts verwandeln
kann:
1 | // µm/step = µm/u / (step/u)
|
2 | #define STEP_PER_UNIT 32 // step/u, sollte Zweierpotenz sein
|
3 | #define MUM_PER_UNIT 10 // µm/u
|
Mit der Zahl hoffe ich, daß es nach einem Jahr verständlicher als als
Exponnent ist.
Uwe B. schrieb:
> #define BZ 2
>
> #define BZ_TEST BZ-1
>
> #if (BZ & BZ_TEST)
> #error not a power of 2
> #endif
Das sieht gut aus. Ich habe auf Anhieb keinen Fall konstruieren können,
wo das für positive Zahlen schiefgeht.
Irgendwann will ich das Ganze vielleicht noch vom Benutzer änderbar
gestalten- dann ist es zwingend, daß es als echte Zahl angezeigt wird.
Dann wird mir wohl nichts anderes übrig bleiben als den dualen
Logarithmus auszurechnen, um die Division von Hand in Shifts zu
verwandeln. Aber momentan reicht mir das hier.
Viele Grüße
W.T.