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