В каких контекстах языки программирования реально используют значение Infinity?

Итак, в Ruby есть уловка для указания бесконечности:

1.0/0
=> Infinity

Я верю, что в Python можно сделать что-то вроде этого

float('inf')

Это всего лишь примеры, я уверен, что большинство языков в некоторой степени обладают бесконечностью. Когда бы вы действительно использовали эту конструкцию в реальном мире? Почему лучше использовать его в диапазоне, чем просто использовать логическое выражение? Например

(0..1.0/0).include?(number) == (number >= 0) # True for all values of number
=> true

Подводя итог, я ищу реальную причину для использования Infinity.

РЕДАКТИРОВАТЬ: Я ищу код реального мира. Хорошо и хорошо сказать, что это когда вы "можете" его использовать, когда люди фактически использовали его.

Что интересно, Руби ошибается. 1.0 / 0 равно отрицательной бесконечности и положительной бесконечности.

Robert Jørgensgaard Engdahl 30.08.2013 12:49

В версиях Ruby> = 1.9.2 Float::INFINITY - более ясный способ обозначить это в коде.

Nathan Long 19.03.2015 17:20
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
28
2
28 252
24
Перейти к ответу Данный вопрос помечен как решенный

Ответы 24

Это может быть полезно в качестве начального значения при поиске минимального значения.

Например:

min = float('inf')

for x in somelist:
  if x<min: 
    min=x

Я предпочитаю изначально устанавливать min на первое значение somelist.

Конечно, в Python в большинстве случаев вам следует просто использовать встроенную функцию min ().

В .NET, например, есть значения Min и Max, которые используются больше бесконечности - например, Int32.MinValue.

Joel Marcey 20.12.2008 03:33
Нет, потому что минимальное значение пустого списка не бесконечно, а просто не существует.
Dario 26.01.2010 22:12

.NET также имеет System.Double.PositiveInfinity.

Jonas Elfström 26.01.2010 22:22

@Dario: Вы можете думать об этом как о продукте пустого набора (x^0 = 1). Технически, max и min (или присоединяйся и встречайся) каждый образуют моноид с элемент идентичности из наименьшая верхняя граница / наибольшей нижней границы соответственно. Числа с плавающей запятой существуют в расширенная строка действительных чисел, который имеет +Inf / -Inf в качестве LUB / GLB. (В Википедии любой термин, выделенный жирным шрифтом, означает больше!)

porges 14.04.2010 00:34

@Dario: Как говорит Поргес, минимум пустого списка является, возможно, бесконечен, точно так же, как сумма пустого списка равна 0 и продукт из пустого списка равны 1 и так далее. (Это потому, что бесконечность - это тождество для «минимума», так же как 0 - это тождество для сложения, а 1 - тождество для умножения.)

ShreevatsaR 03.12.2010 19:58

Вот как я его использовал, только что. Пример того, когда вы не сможете использовать min: когда значения, которые вы берете как минимум, не доступны сразу, и вам нужен текущий минимум. (Возможно, для вычисления каждого нового значения требуется много времени или оно отправляется вам по сети.)

Kragen Javier Sitaker 29.12.2011 20:58

Вы все думаете об этом в математическом смысле с серьезными ошибками, но все, что я вижу, - это удобный способ убедиться, что любое число будет меньше начального значения min ...

Schilcote 17.02.2014 19:25

При работе в проблемной области, где используется триггер (особенно касательный), бесконечность - это ответ, который может возникнуть. В конечном итоге Trig активно используется в графических приложениях, играх и геопространственных приложениях, а также в очевидных математических приложениях.

Как добиться этого на практике? В Python math.tan(math.pi/2) дает мне 16331778728383844.0, а не inf.

Kragen Javier Sitaker 29.12.2011 21:04

Вероятно, это проблема с неточностью чисел с плавающей запятой в Python. math.pi - это не совсем число Пи, его достаточно для большинства случаев.

John Meagher 20.02.2012 03:43

Что ж, очевидно. (Хотя это, вероятно, не относится к Python!) Но можно ли получить бесконечность из триггерных функций?

Kragen Javier Sitaker 07.03.2012 22:42

В некоторых физических вычислениях вы можете нормализовать неоднородности (например, бесконечные числа) одного порядка друг с другом, отменяя их обе и позволяя получить приблизительный результат.

Когда вы имеете дело с ограничениями, могут быть достигнуты вычисления вроде (бесконечность / бесконечность) -> приближение к конечному числу. Для языка полезно иметь возможность перезаписывать обычную ошибку деления на ноль.

На мой взгляд, это действительно лучший пример из реального мира. Используйте графический калькулятор, чтобы «волшебным образом» вычислить предел, и вы увидите его в действии. +1

William Brendel 20.12.2008 03:38

решающим моментом, конечно же, является баланс бесконечностей, что является проблемой в нескольких основных областях исследований.

annakata 08.01.2009 00:19

Получите свои NaN у стойки. ;)

3yE 27.03.2010 22:11

Если одни бесконечности более равны, чем другие, разве вы не захотели бы создать свой собственный класс?

Andrew Grimm 11.04.2011 03:10

Я уверен, что есть другие способы сделать это, но вы можете использовать Infinity для проверки разумных вводов при преобразовании String-to-Float. В Java, по крайней мере, статический метод Float.isNaN () будет возвращать false для чисел с бесконечной величиной, указывая, что они являются действительными числами, даже если ваша программа может захотеть классифицировать их как недопустимые. Проверка на соответствие константам Float.POSITIVE_INFINITY и Float.NEGATIVE_INFINITY решает эту проблему. Например:

// Some sample values to test our code with
String stringValues[] = {
  "-999999999999999999999999999999999999999999999",
  "12345",
  "999999999999999999999999999999999999999999999"
};

// Loop through each string representation
for (String stringValue : stringValues) {
  // Convert the string representation to a Float representation
  Float floatValue = Float.parseFloat(stringValue);

  System.out.println("String representation: " + stringValue);
  System.out.println("Result of isNaN: " + floatValue.isNaN());

  // Check the result for positive infinity, negative infinity, and
  // "normal" float numbers (within the defined range for Float values).
  if (floatValue == Float.POSITIVE_INFINITY) {
    System.out.println("That number is too big.");
  } else if (floatValue == Float.NEGATIVE_INFINITY) {
    System.out.println("That number is too small.");
  } else {
    System.out.println("That number is jussssst right.");
  }
}

Пример вывода:

Строковое представление: -9999999999999999999999999999999999999999999
Результат isNaN: false
Это слишком мало.

Строковое представление: 12345
Результат isNaN: false
Это число совершенно верно.

Строковое представление: 9999999999999999999999999999999999999999999
Результат isNaN: false
Это слишком большое число.

Ответ принят как подходящий

Алгоритм Дейкстры обычно назначает бесконечность в качестве начальных весов ребер в графе. Это не имеют как «бесконечность», просто некоторая произвольная константа, но в java я обычно использую Double.Infinity. Я предполагаю, что рубин можно использовать аналогичным образом.

Алгоритм Беллмана-Форда решает те же проблемы, что и алгоритм Дейкстры, а также использует бесконечность для обозначения недоступности.

vinc456 13.01.2009 17:55

Double.Infinity? зачем останавливаться на достигнутом? Выбирайте Triple.Infinitiy. :)

Doug T. 11.12.2009 06:12

Да, практически любой алгоритм, работающий с взвешенными орграфами, может разумно задействовать бесконечность тем или иным образом (как «вес» несуществующего или неизвестного ребра).

bcat 11.12.2009 06:13

Это, кстати, частный случай ответа @Triptych: бесконечность - это минимум пустого списка. (Алгоритм Дейкстры или алгоритм Беллмана-Форда работают, устанавливая веса и многократно устанавливая их на минимум их текущего значения и некоторого другого значения.)

ShreevatsaR 03.12.2010 19:59

Альфа-бета обрезка

+1, но / и обратите внимание, что этот также является частным случаем принципа «минимум пустого списка - бесконечность».

ShreevatsaR 06.12.2010 20:04

Некоторые программисты используют Infinity или NaNs, чтобы показать, что переменная никогда не была инициализирована или назначена в программе.

Зачем вам использовать Infinity, если nil специально предназначен для этого?

Nathan Long 22.08.2014 18:05

Я использую его, когда у меня есть объект Range, у которого должен быть открыт один или оба конца.

Используйте Infinity и -Infinity, когда это требует математический алгоритм.

В Ruby Infinity и -Infinity обладают хорошими сравнительными свойствами, так что -Infinity <x <Infinity для любого действительного числа x. Например, Math.log(0) возвращает -Infinity, расширяя до 0 свойство, которое x > y подразумевает, что Math.log(x) > Math.log(y). Кроме того, Infinity * x - это Infinity, если x> 0, -Infinity, если x <0, и 'NaN' (не число, то есть не определено), если x равно 0.

Например, я использую следующий фрагмент кода в части вычисления некоторого логарифмические отношения правдоподобия. Я явно ссылаюсь на -Infinity, чтобы определить значение, даже если k - это 0 или n, И x - это 0 или 1.

Infinity = 1.0/0.0
def Similarity.log_l(k, n, x)
  unless x == 0 or x == 1
    k * Math.log(x.to_f) + (n-k) * Math.log(1.0-x)
  end
    -Infinity
  end
end

Кажется, подразумевается «Почему эта функция вообще существует?» в вашем вопросе. Причина в том, что Ruby и Python просто предоставляют доступ ко всему диапазону значений, которые можно указать в форме с плавающей запятой, как указано в IEEE.

Эта страница, кажется, хорошо описывает это: http://steve.hollasch.net/cgindex/coding/ieeefloat.html

В результате у вас также могут быть значения NaN (Not-a-number) и -0.0, хотя у вас также может не сразу появиться реальное применение для них.

Хорошая находка по резюме! Чтобы уточнить, я прочитал спецификацию IEEE перед тем, как опубликовать вопрос. Я понимаю теоретическую полезность этой конструкции, мне просто было любопытно, как люди применяли ее, поскольку я никогда раньше не встречал ее в коде.

Chris Lloyd 21.12.2008 02:01

Я использовал его в минимаксный алгоритм. Когда я генерирую новые ходы, если минимальный игрок выигрывает на этом узле, то значение узла равно -∞. И наоборот, если побеждает максимальный игрок, то значение этого узла равно + ∞.

Кроме того, если вы генерируете узлы / игровые состояния, а затем пробуете несколько эвристик, вы можете установить все значения узлов на -∞ / + ∞, что когда-либо имеет смысл, а затем, когда вы запускаете эвристику, легко установить значение узла :

node_val = -∞
node_val = max(heuristic1(node), node_val)
node_val = max(heuristic2(node), node_val)
node_val = max(heuristic2(node), node_val)

Я использовал его в DSL, похожем на has_one и has_many от Rails:

has 0..1 :author
has 0..INFINITY :tags

Это упрощает выражение таких понятий, как звезда Kleene и плюс в вашем DSL.

Я использую его, чтобы указать массу и инерцию статического объекта в физическом моделировании. Статические объекты практически не подвержены влиянию гравитации и других сил моделирования.

Я использовал его для случаев, когда вы хотите определить диапазоны предпочтений / разрешенных.

Например, в приложениях 37signals у вас есть ограничение на количество проектов.

Infinity = 1 / 0.0
FREE = 0..1
BASIC = 0..5
PREMIUM = 0..Infinity

тогда вы можете делать такие проверки, как

if PREMIUM.include? current_user.projects.count 
 # do something
end

Мне это очень нравится, потому что вы выражаете свое настоящее намерение. Infinity представляет неограниченное, так же как nil представляет неизвестное.

Nathan Long 22.08.2014 18:00

Я использовал символические значения для положительной и отрицательной бесконечности при сравнении диапазонов, чтобы исключить угловые случаи, которые в противном случае потребовали бы специальной обработки:

Даны два диапазона A = [a, b) и C = [c, d), пересекаются ли они, один больше другого или один содержит другой?

A > C iff a >= d
A < C iff b <= c
etc...

Если у вас есть значения для положительной и отрицательной бесконечности, которые соответственно больше и меньше всех других значений, вам не нужно выполнять какую-либо специальную обработку для открытых диапазонов. Поскольку числа с плавающей запятой и двойные значения уже реализуют эти значения, вы также можете использовать их вместо того, чтобы пытаться найти наибольшие / наименьшие значения на своей платформе. С целыми числами труднее использовать «бесконечность», поскольку она не поддерживается оборудованием.

Он довольно широко используется в графике. Например, любой пиксель в трехмерном изображении, который не является частью реального объекта, помечается как бесконечно удаленный. Чтобы потом его можно было заменить фоновым изображением.

Это еще один пример ответа «минимум набора», но он действительно проясняет, почему не всегда имеет смысл просто вызывать min() с набором в качестве аргумента :)

Kragen Javier Sitaker 29.12.2011 21:06

Я использовал его для представления расстояния фокусировки камеры и, к моему удивлению, в Python:

>>> float("inf") is float("inf")
False
>>> float("inf") == float("inf")
True

Интересно, почему это так.

Ну да ... это странно. Попробовав это самостоятельно, я также обнаружил, что если вы назначите float('inf') переменной (скажем, a), а затем попробуете a is a, она вернет True. Затем, выполняя b = 0, затем b += a, a is b вернет False, а a == b вернет True. Другими словами, использование is проверяет, являются ли поплавки одним и тем же объектом, а использование == проверяет, имеют ли они одинаковое значение.

JAB 31.07.2009 22:18

По-видимому, это просто равенство для id, и реализация здесь не использует уловки, как это происходит с целыми числами. Бесконечность используется довольно редко, как следует из вопроса. Теперь мне интересно, почему я тогда задавался вопросом; P

dhill 06.08.2009 16:31

вам практически никогда не следует использовать "is" в python, поскольку он обходит программируемую функциональность "= = ". «is» дает представление о том, как реализована среда выполнения Python, но, по моему опыту, это больше проблем, чем того стоит, поэтому я всегда использую «==».

thejoshwolfe 18.09.2011 01:14
a is b в Python сообщает вам, повлияет ли модификация a на b. Для неизменяемых объектов, таких как поплавки, этот вопрос отпадает.
Kragen Javier Sitaker 29.12.2011 21:01

В Ruby бесконечность можно использовать для реализации ленивых списков. Скажем, мне нужно N чисел, начинающихся с 200, которые каждый раз последовательно увеличиваются на 100 единиц:

Inf = 1.0 / 0.0
(200..Inf).step(100).take(N)

Подробнее здесь: http://banisterfiend.wordpress.com/2009/10/02/wtf-infinite-ranges-in-ruby/

Я наткнулся на это, потому что я ищу "бесконечное" значение для максимального значения, если данное значение не существует, в попытке создать двоичное дерево. (Поскольку я выбираю на основе диапазона значений, а не только одного значения, я быстро понял, что даже хеш не сработает в моей ситуации.)

Поскольку я ожидаю, что все задействованные числа будут положительными, минимизировать легко: 0. Поскольку я не знаю, чего ожидать от максимума, я бы хотел, чтобы верхняя граница была какой-то бесконечностью. Таким образом, мне не придется выяснять, с каким «максимумом» мне следует сравнивать.

Поскольку это проект, над которым я работаю на работе, технически это «проблема реального мира». Это может быть немного редко, но, как и многие абстракции, удобно, когда вам это нужно!

Кроме того, тем, кто говорит, что этот (и другие примеры) надуманы, я хотел бы указать, что абстракции все несколько надуманы; это не значит, что они полезны, когда вы их придумываете.

Я использую сетевую библиотеку, где вы можете указать максимальное количество попыток переподключения. Поскольку я хочу, чтобы мой снова подключился навсегда:

my_connection = ConnectionLibrary(max_connection_attempts = float('inf'))

На мой взгляд, он более понятен, чем типичный стиль «установить на -1, чтобы повторить попытку навсегда», поскольку он буквально говорит «повторите попытку, пока количество попыток подключения не превысит бесконечность».

Вы можете использовать:

import decimal
decimal.Decimal("Infinity")

или же:

from decimal import *
Decimal("Infinity")

Это не отвечает на фактический вопрос, изначально заданный: «То, что я ищу, является реальной причиной для использования Infinity».

zzzirk 07.11.2012 17:49

Для сортировки

Я видел, как оно использовалось как значение сортировки, чтобы сказать «всегда сортировать эти элементы вниз».

Если вы хотите получить наибольшее число от ввода, но они могут использовать очень большие негативы. Если я введу -13543124321.431, оно все равно будет работать как наибольшее число, так как оно больше, чем -inf.

enter code here
initial_value = float('-inf')
while True:
    try:
        x = input('gimmee a number or type the word, stop ')
    except KeyboardInterrupt:
        print("we done - by yo command")
        break
    if x == "stop":
        print("we done")
        break
    try:
        x = float(x)
    except ValueError:
        print('not a number')
        continue
    if x > initial_value: initial_value = x
print("The largest number is: " + str(initial_value))

Чтобы указать несуществующий максимум

Если вы имеете дело с числами, nil представляет собой неизвестное количество, и в этом случае его следует предпочесть 0. Точно так же Infinity представляет собой неограниченное количество, и в этом случае он должен быть предпочтительнее (arbitrarily_large_number).

Я думаю, это может сделать код чище. Например, я использую Float::INFINITYв рубиновом камне именно для этого: пользователь может указать максимальную длину строки для сообщения или он может указать :all. В этом случае я представляю максимальную длину как Float::INFINITY, чтобы позже, когда я проверяю, "длиннее ли это сообщение максимальной длины?" ответ всегда будет ложным, без особых случаев.

Другие вопросы по теме