Всем привет! Несколько дней назад я узнал об одной очень крутой фишке в С++. Многие кфщики используют макрос "#define INF 100000007". Вместо этого можно просто писать INFINITY и это будет работать как максимальное число в текущем типе. Например:
ll ans = INFINITY; //long_long_max
if (smth < INFINITY) //int_max by default
if (smth < (long long)INFINITY) //long_long_max
Я не видел это в кодах. Возможно кому-то это будет интересно и он начнет это использовать
Одна проблема: иногда мы хотим прибавить что-нибудь к бесконечности и потом сравнить эту сумму с чем-то. А если я прибавлю 1 к int_max, я явно получу что-то нехорошее. Поэтому в этом плане взять в роли бесконечности что-то типа 1e9 — выгодный вариант.
Согласен, для таких случаев это не подходит. Но мне почему то не приходит в голову ни одного варианта когда нужно к бесконечности что-то прибавлять. Можете привести пример?
Согласен. Для такой реализации Флойда это не подходит. Но все-таки можно писать так:
Хотя я согласен это дольше и иногда проще написать свой INF.
Не понимаю, за что меня минусуют)
Ваша поправка ничего не меняет
int x = INFINITY;
// x < INFINITYТем не менее, его вариант идейно более правильный. Дело в том, что в алгоритме Флойда обычно встречаются ребра отрицательного веса. А бесконечность + что-то отрицательное уже меньше бесконечности, так что в любом случае приходится ифать.
It's not so useful. For example long long answer = INFINITY; if (answer == INFINITY) // answer != INFINITY
Yes, in this case it will not work. But it is possible to write
And it will work correctly.
That is not really useful because you usually want to have INFINITY/2 and not INFINITY itself, since any addition will overflow type. In other words you really don't want inequalities INF+5<INF to be correct.
I use
(1 << 30)
forint
. And(1ll << 60)
forlong long
type.As Shtrix stated too , it's not really useful because you simply can not do any addition to the value correctly , but if you insist on using this , I'd choose the safer way :