Funktion für Maximum
-
Wo wir bei dem Thema waren: Ich habe mal gehört, dass man das auch ohne Vergleichsoperatoren(!)& auch ohne Zeiger/Arrays programmieren kann. Dieser Ansatz hier scheint plausibel, aber ohne Arrays und Vergleichsoperatoren?
-
Wo wir gerade dabei sind... darf man Anwälte eigentlich als Vergleichsoperatoren bezeichnen?
-
Ja, man kann das Maximum/Minimum von zwei Zahlen auch durch geschickte Rechnung bestimmen:
http://graphics.stanford.edu/~seander/bithacks.html#IntegerMinOrMaxOhne Arrays: Nun, Arrays sind nur ein Weg, Daten in einer Sequenz anzuordnen. Du brauchst hier ja nicht einmal eine Sequenz, es reicht ja sogar eine allgemeine Menge. Da gibt es haufenweise Mittel und Wege.
-
@Decimad: Tut mir leid, ich meine natürlich logische Operatoren.
@SeppJ: Das ist eine wirklich interessante Lösung. Das Problem besteht aber, wenn man anstatt integer Werte double oder float nimmt. Dann würden Bit-Operatoren nicht viel sinn machen. Eine wirkliche Lösung dafür habe ich bisher nicht gefnden.
-
Ok, jetzt bitte das Orginalproblem mit varaidic template Parametern! Sollte nicht allzu schwer sein. Auch wenn es die nicht in C++ gibt. Alternativ kann ja auch va_list benutzt werden.
-
Franzi42 schrieb:
@SeppJ: Das ist eine wirklich interessante Lösung. Das Problem besteht aber, wenn man anstatt integer Werte double oder float nimmt. Dann würden Bit-Operatoren nicht viel sinn machen. Eine wirkliche Lösung dafür habe ich bisher nicht gefnden.
Jetzt wird es wirklich clever: In IEEE 754 (das ist der Standard zur Darstellung von Fließkommazahlen, der praktisch universell benutzt wird) sind die Werte "lexikographisch" geordnet. Das heißt:
William Kahan (der hat's erfunden) schrieb:
if two floating-point numbers in the same format are ordered ( say x < y ), then they are ordered the same way when their bits are reinterpreted as Sign-Magnitude integers.
Zu deutsch: Du kannst die Werte als (signed) Integers (oder long, je nach Größe des Typs) auffassen und dann einen Integervergleich machen und erhältst das gleiche Ergebnis. Und den Integervergleich darfst du dann gerne auch mittels der Bittrickereien durchführen.
#include <limits.h> float float_max(float d1, float d2) { // Ohne C11 sollte man das anders prüfen: _Static_assert(sizeof(float)==sizeof(int), "Float und int müssen gleich groß sein"); int x = *(int*)(&d1); int y = *(int*)(&d2); int r = x - ((x - y) & ((x - y) >> (sizeof(int) * CHAR_BIT - 1))); return *(float*)(&r); } #include <stdio.h> void compare(float d1, float d2) { printf("Das Maximum von %f und %f ist %f\n", d1, d2, float_max(d1,d2)); } int main() { compare(1.4334, 2.33); compare(1.323, -2.23); compare(1./0., 9.423e16); }