Задать вопрос

Как сравнить два вещественных числа без if?

Собственно, надо сравнить два числа, не используя условных операторов и операций сравнения. Язык - 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;
	}
}
  • Вопрос задан
  • 5363 просмотра
Подписаться 2 Оценить 4 комментария
Пригласить эксперта
Ответы на вопрос 2
@VitGun
Тернарный оператор?
Ответ написан
Math.abs(a-b)/(a-b)
Это без учёта равенства чисел. Библиотечный метод abs транслируется в команду fabs fpu. Никаких сравнений.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы