Как можно сравнить два числа?
Ответы на вопрос
Есть несколько удобных способов сравнить два числа — в зависимости от их вида и контекста (математика “на бумаге” или программирование).
Базовые приёмы
-
По числовой прямой. Буквально представить точки на оси: левее — меньше, правее — больше. Полезно для интуиции и оценок.
-
Через вычитание. Посчитать .
-
Если — ; если — ; если — равны.
-
Аккуратно с вычислительной реализацией: при очень больших по модулю целых возможен переполнения, а для чисел с плавающей точкой — накопление ошибки (см. ниже).
-
-
По знакам. Если одно число положительное, а другое отрицательное, сравнение очевидно: положительное больше. Ноль — промежуточный ориентир: ; .
Дроби и рациональные числа
-
Общий знаменатель. и : привести к общему знаменателю или просто сравнить перекрёстно:
эквивалентно при .
Если знаменатели могут быть отрицательными — сначала нормализовать знак (перенести «минус» в числитель). -
Смешанные формы. Удобно выделять целую часть: больше тот, у кого целая часть больше; если равны — сравнивать дробные части как выше.
Порядки величин и «большие» выражения
-
Степени и произведения. Чтобы сравнить и при , удобно сравнить и (или и ). Это избегает переполнений.
-
Очень большие положительные целые. Сначала сравнивают по числу цифр (у кого больше — тот больше). Если длины равны — лексикографически по цифрам слева направо.
Практические нюансы в программировании
-
Обычные операторы. В большинстве языков:
<,>,<=,>=,==. Для упорядочивания/сортировки — функции наподобиеcompare(a,b). -
Целые типы и переполнение. Избегайте « и смотреть знак» в типах фиксированной ширины. Предпочтительнее:
-
Java:
Integer.compare(a,b),Long.compare(a,b); -
C/C++: прямые сравнения
if (a < b)вместо вычисления разности; -
Для произвольной разрядности — типы вроде
BigInteger.
-
-
Числа с плавающей точкой. Не сравнивайте на точное равенство. Используйте допуск (эпсилон):
два числаxиyсчитаем равными, если|x - y| <= eps * max(1, |x|, |y|).
Тогда:-
x < y, еслиx + tol < y; -
x > y, еслиx > y + tol; -
иначе — «практически равны». Значение
epsвыбирают под задачу (например,1e-9для двойной точности).
-
-
Десятичные деньги/точные дроби. Применяют десятичные типы/библиотеки с точным масштабом (
decimal,BigDecimal) и сравнивают методамиcompareTo, чтобы избежать двоичных артефактов. -
Строки с числами. Для положительных целых, записанных строками без лидирующих нулей, можно сравнить по длине, а затем лексикографически. Для общих случаев строки нужно парсить в числовой тип.
Когда «сравнить» нельзя
-
Комплексные числа. Для них нет естественного линейного порядка, совместимого с арифметикой. Можно сравнивать только отдельные характеристики (например, модули: и ), но это уже не сравнение самих комплексных чисел «что больше/меньше».
Короткие примеры
-
vs : сравниваем и ⇒ ⇒ .
-
vs : сравниваем и ⇒ .
-
С плавающей точкой: пусть
x=0.3,y=0.1+0.2. Наивноx==yможет датьfalse. С допускомeps=1e-9:|x-y|меньше допуска ⇒ считаем равными.
В итоге, выбор способа зависит от типа чисел: для «обычных» — достаточно операторов сравнения; для дробей — перекрёстное умножение; для больших/степенных выражений — логарифмы; для вычислительной математики — допуски и типы произвольной точности.
Похожие вопросы
Топ вопросов за вчера в категории Математика
Последние заданные вопросы в категории Математика
-
Математика
-
Литература
-
Алгебра
-
Русский язык
-
Геометрия
-
Английский язык
-
Химия
-
Физика
-
Биология
-
Другие предметы
-
История
-
Обществознание
-
Окружающий мир
-
География
-
Українська мова
-
Информатика
-
Українська література
-
Қазақ тiлi
-
Экономика
-
Музыка
-
Право
-
Беларуская мова
-
Французский язык
-
Немецкий язык
-
МХК
-
ОБЖ
-
Психология
-
Физкультура и спорт
-
Астрономия
-
Кыргыз тили
-
Оʻzbek tili

