Собственно, надо сравнить два числа, не используя условных операторов и операций сравнения. Язык - Java.
Для целых чисел проблем никаких нет, все делается в одну строку. Проблемы начинаются, если числа вещественные. Вообще, мой алгоритм такой: отнять одно число от другого и посмотреть на знак получившегося выражения. Но это не сработает для double, так как знак можно получить операциями сдвига, которые определены только для целых чисел. привести к целому тоже нельзя, потому что если разница чисел меньше единицы, то алгоритм отработает не верно. Придумал такой трюк:
public class Compare {
public static int cmp(double a, double b) {
double r = a - b, d = 0;
int i = 19;
while (i != 0 && d == 0) {
r *= 10;
d = (int)r % 10;
i--;
}
return ((int)d >> 63) + 1;
}
}
Осталось избавиться от цикла и двух сравнений. Цикл я думал заменить на рекурсию. А что сделать со сравнением даже не знаю. Привести к типу boolean язык не позволяет, что меня очень огорчает.
Что можете посоветовать? Может есть более простые способы?
P.S. Метод должен работать одновременно для целых и вещественных чисел.
P.P.S.
Вдруг кому пригодится, вот решение:
public class Compare {
public static int cmp(double a, double b) {
return (int)((Double.doubleToRawLongBits(a - b)) >> 63) + 1;
}
}