В каких контекстах языки программирования реально используют значение Бесконечности?
Итак, в 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 или NaN
s, чтобы показать, что переменная никогда не была инициализирована или назначена в программе.
Если вы хотите, наибольшее число из входного, но они могут использовать очень большие минусы. Если я введу -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")