В каких контекстах языки программирования реально используют значение Бесконечности?
Итак, в Ruby есть трюк, чтобы указать бесконечность:
1.0/0
=> Infinity
Я верю в Python, вы можете сделать что-то подобное
float('inf')
Это всего лишь примеры, хотя я уверен, что большинство языков имеют бесконечность в некотором качестве. Когда бы вы на самом деле использовали эту конструкцию в реальном мире? Почему использование его в диапазоне лучше, чем просто использование логического выражения? Например,
(0..1.0/0).include?(number) == (number >= 0) # True for all values of number
=> true
подводя итог, то, что я ищу, является реальной причиной использования Бесконечность.
редактировать: Я ищу код реального мира. Это все хорошо и хорошо сказать, когда вы "могли" использовать его, когда у людей на самом деле использовал его.
24 ответов
алгоритм Дейкстры обычно назначает бесконечность в качестве начальных Весов ребер в графе. Это не есть быть "бесконечностью", просто некоторой произвольно постоянной, но в java я обычно использую Double.Бесконечность. Я предполагаю, что ruby можно использовать аналогичным образом.
С верхней части головы, она может быть полезна в качестве начального значения при поиске минимального значения.
например:
min = float('inf')
for x in somelist:
if x<min:
min=x
который я предпочитаю устанавливать min первоначально до первого значения somelist
конечно, в Python вы должны просто использовать встроенную функцию min () в большинстве случаев.
кажется, что подразумевается " почему эта функциональность вообще существует?"в вашем вопросе. И причина в том, что Ruby и Python просто предоставляют доступ к полному диапазону значений, которые можно указать в форме с плавающей запятой, как указано IEEE.
эта страница, кажется, хорошо описывает это: http://steve.hollasch.net/cgindex/coding/ieeefloat.html
в результате вы также можете иметь значения NaN (Not-a-number) и -0.0, в то время как вы не можете сразу у них есть реальное использование для них.
в некоторых физических вычислениях вы можете нормализовать нерегулярности (т. е. бесконечные числа) одного порядка друг с другом, отменяя их оба и позволяя приблизительному результату прийти.
когда вы имеете дело с пределами, расчеты, такие как (бесконечность / бесконечность) -> приближение к конечному числу может быть достигнуто. Для языка полезно иметь возможность перезаписывать регулярную ошибку деления на ноль.
использовать Infinity и -Infinity при реализации математического алгоритма вызывает его.
В Ruby, Infinity и -Infinity есть хорошие сравнительные свойства, так что -Infinity x Infinity для любого действительного числа x. Например, Math.log(0) возвращает -Infinity, распространяясь на 0 свойство x > y означает, что Math.log(x) > Math.log(y). Кроме того,Infinity * x is Infinity если x > 0, -Infinity если x
для например, я использую следующий бит кода в части вычисления некоторого отношения правдоподобия лог. Я явно указать -Infinity чтобы определить значение, даже если k is 0 или n и x is 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 infinity можно использовать для реализации ленивых списков. Скажем, я хочу 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/
я использовал его для случаев, когда вы хотите определить диапазоны настройки / допускается.
например, в приложениях 37signals у вас есть ограничение на номер проекта
Infinity = 1 / 0.0
FREE = 0..1
BASIC = 0..5
PREMIUM = 0..Infinity
тогда вы можете делать проверки, как
if PREMIUM.include? current_user.projects.count
# do something
end
я использовал его для представления расстояния фокусировки камеры и к моему удивлению в Python:
>>> float("inf") is float("inf")
False
>>> float("inf") == float("inf")
True
интересно, почему это.
я использовал его в алгоритм минимакса. Когда я генерирую новые ходы, если минимальный игрок выигрывает на этом узле, то значение узла -∞. И наоборот, если игрок max выигрывает, то значение этого узла равно +∞.
кроме того, если вы генерируете узлы / игровые состояния, а затем пробуете несколько эвристик, вы можете установить все значения узлов в -∞/+∞, что когда-либо имеет смысл, а затем, когда вы запускаете эвристику, легко установить значение узла:
node_val = -∞
node_val = max(heuristic1(node), node_val)
node_val = max(heuristic2(node), node_val)
node_val = max(heuristic2(node), node_val)
я использовал его в DSL, похожем на Rails'has_one и has_many:
has 0..1 :author
has 0..INFINITY :tags
Это позволяет легко выражать такие понятия, как kleene star и plus в вашем DSL.
я использовал символические значения для положительной и отрицательной бесконечности при работе с сравнениями диапазонов для устранения угловых случаев, которые в противном случае потребовали бы специальной обработки:
учитывая два диапазона A=[a,b) и C=[c, d) пересекаются ли они, один больше другого или один содержит другой?
A > C iff a >= d
A < C iff b <= c
etc...
Если у вас есть значения для положительной и отрицательной бесконечности, которые соответственно сравнивают больше и меньше всех других значений, вам не нужно делать никаких специальных обработка для открытых диапазонов. Поскольку floats и Double уже реализуют эти значения, вы можете использовать их вместо того, чтобы пытаться найти самые большие/самые маленькие значения на своей платформе. С целыми числами сложнее использовать "бесконечность", поскольку она не поддерживается аппаратным обеспечением.
Я столкнулся с этим, потому что я ищу "бесконечное" значение для максимального, если данное значение не существует, в попытке создать двоичное дерево. (Поскольку я выбираю на основе диапазона значений, а не только одного значения, я быстро понял, что даже хэш не будет работать в моей ситуации.)
поскольку я ожидаю, что все числа будут положительными, минимум прост: 0. Поскольку я не знаю, чего ожидать от максимума, я бы хотел, чтобы верхняя граница была Какая-то бесконечность. Таким образом, мне не придется выяснять, с каким "максимумом" я должен сравнивать вещи.
поскольку это проект, над которым я работаю на работе, это технически "проблема реального мира". Это может быть kindof редко, но, как и много абстракций, это удобно, когда вам это нужно!
кроме того, тем, кто говорит, что это (и другие примеры) придуманы, я бы указал, что все абстракции несколько условна; это не значит, что они полезно, когда вы их придумываете.
при работе в проблемной области, где используется тригонометрия (особенно касательная), бесконечность-это ответ, который может возникнуть. Trig в конечном итоге используется в графических приложениях, играх и геопространственных приложениях, а также в очевидных математических приложениях.
Я уверен, что есть другие способы сделать это, но вы можете использовать Infinity для проверки разумных входных данных в преобразовании String-to-Float. В Java, по крайней мере, поплавок.статический метод isNaN () вернет false для чисел с бесконечной величиной, указывая, что они являются допустимыми числами, даже если ваша программа может захотеть классифицировать их как недопустимые. Сверяюсь с поплавком.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: false
Это число слишком мало.
строковое представление: 12345
Результат isNaN: false
Это число jussssst право.
строковое представление: 999999999999999999999999999999999999999999999
Результат isNaN: false
Этот номер тоже большой.
Он довольно широко используется в графике. Например, любой пиксель в 3D-изображении, который не является частью реального объекта, помечается как бесконечно далекий. Чтобы потом его можно было заменить фоновым изображением.
Я использую сетевую библиотеку, где вы можете указать максимальное количество попыток повторного подключения. Так как я хочу, чтобы мой воссоединиться навсегда:
my_connection = ConnectionLibrary(max_connection_attempts = float('inf'))
на мой взгляд, это более ясно, чем типичный стиль "set to -1 to retry forever", поскольку он буквально говорит "retry, пока количество попыток подключения не превысит бесконечность".
некоторые программисты используют Infinity или NaNs, чтобы показать, что переменная никогда не была инициализирована или назначена в программе.
Если вы хотите, наибольшее число из входного, но они могут использовать очень большие минусы. Если я введу -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, так что позже, когда я проверю " это сообщение длиннее максимальной длины?- ответ всегда будет ложным, не требуя особого случая.
Вы можете использовать:
import decimal
decimal.Decimal("Infinity")
или:
from decimal import *
Decimal("Infinity")