В каких контекстах языки программирования реально используют значение 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 ]

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

Алгоритм Дейкстры обычно назначает бесконечность в качестве начальных весов ребер в графе. Это не имеет , чтобы быть "бесконечностью", просто какой-то произвольно постоянной, но в Java я обычно использую Double.Infinity. Я полагаю, что ruby ​​можно использовать аналогичным образом.

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

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

Например:

min = float('inf')

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

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

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

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

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

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

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

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

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

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

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

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

В Ruby Infinity и -Infinity имеют хорошие сравнительные свойства, так что -Infinity <<code>x <<code>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. </p>

Например, я использую следующий бит кода в части вычисления некоторых логарифмических правдоподобий . Я явно ссылаюсь на -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
8 голосов
/ 20 декабря 2008
8 голосов
/ 30 декабря 2008

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

6 голосов
/ 11 декабря 2009

В 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/

5 голосов
/ 07 января 2009

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

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

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

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

if PREMIUM.include? current_user.projects.count 
 # do something
end
4 голосов
/ 31 июля 2009

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

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

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

...