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?


  • Mod

    Ja, man kann das Maximum/Minimum von zwei Zahlen auch durch geschickte Rechnung bestimmen:
    http://graphics.stanford.edu/~seander/bithacks.html#IntegerMinOrMax

    Ohne 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. 🙂


  • Mod

    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);
    }
    

Anmelden zum Antworten