В каких контекстах языки программирования реально используют значение Infinity? - PullRequest
28 голосов
/ 20 декабря 2008

Так что в Ruby есть трюк для указания бесконечности:

1.0/0
=> Infinity

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

float('inf')

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

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

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

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

Ответы [ 24 ]

3 голосов
/ 30 декабря 2008

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

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

Это позволяет легко выразить такие понятия, как Kleene star и plus, в вашем DSL.

3 голосов
/ 22 декабря 2008

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

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

node_val = -∞
node_val = max(heuristic1(node), node_val)
node_val = max(heuristic2(node), node_val)
node_val = max(heuristic2(node), node_val)
2 голосов
/ 14 апреля 2010

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

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

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

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

2 голосов
/ 08 января 2009

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

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

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

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

2 голосов
/ 20 декабря 2008

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

1 голос
/ 20 декабря 2008

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

1 голос
/ 20 декабря 2008

Я уверен, что есть и другие способы сделать это, но вы могли бы использовать 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.");
  }
}

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

Представление строки: -999999999999999999999999999999999999999999999
Результат isNaN: ложь
Это число слишком мало.

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

Представление строки: 999999999999999999999999999999999999999999999
Результат isNaN: ложь
Это число слишком велико.

1 голос
/ 13 января 2009

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

1 голос
/ 09 апреля 2011

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

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

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

0 голосов
/ 19 марта 2015

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

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

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

...