28

所以在 Ruby 中有一个技巧来指定无穷大:

1.0/0
=> Infinity

我相信 Python 你可以做这样的事情

float('inf')

不过,这些只是示例,我确信大多数语言在某些方面都具有无限性。你什么时候会在现实世界中真正使用这个构造?为什么在范围内使用它比仅使用布尔表达式更好?例如

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

总而言之,我正在寻找的是使用 Infinity 的真实世界理由。

编辑:我正在寻找真实世界的代码。可以说这是您“可以”使用它的时候,人们实际使用它的时候,这一切都很好。

4

24 回答 24

35

在头顶上,在搜索最小值时,它可以用作初始值。

例如:

min = float('inf')

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

我更喜欢min最初设置为的第一个值somelist

当然,在 Python 中,在大多数情况下,您应该只使用 min() 内置函数。

于 2008-12-19T23:55:12.843 回答
35

Dijkstra 算法通常将无穷大指定为图中的初始边权重。这不一定“无穷大”,只是一些任意常数,但在 java 中我通常使用 Double.Infinity。我认为可以类似地使用红宝石。

于 2008-12-20T00:40:24.123 回答
17

似乎有一个隐含的“为什么这个功能甚至存在?” 在你的问题中。原因是 Ruby 和 Python 只是提供了访问 IEEE 指定的浮点形式可以指定的全部值的权限。

这个页面似乎描述得很好: http ://steve.hollasch.net/cgindex/coding/ieeefloat.html

因此,您还可以使用 NaN(非数字)值和 -0.0,但您可能也不会立即在实际世界中使用这些值。

于 2008-12-20T14:03:13.660 回答
11

在一些物理计算中,您可以将相同阶数的不规则性(即无限数)相互标准化,同时取消它们并允许得出近似结果。

当您处理限制时,可以实现像 (infinity / infinity) -> 接近一个有限数这样的计算。语言能够覆盖常规的被零除错误是很有用的。

于 2008-12-20T00:07:03.100 回答
10

在实现数学算法时使用Infinity和调用它。-Infinity

在 Ruby 中,Infinity并且-Infinity具有很好的比较属性,因此-Infinity< x<Infinity对于任何实数x。例如,Math.log(0)返回-Infinity,扩展到暗示0的属性。此外,如果 x > 0,如果 x < 0,如果 x为0,则为“NaN”(不是数字;即未定义)。x > yMath.log(x) > Math.log(y)Infinity * xInfinity-Infinity

例如,我在一些对数似然比的计算中使用了以下代码。-Infinity即使kis0nANDx0or ,我也会明确引用定义一个值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
于 2008-12-20T01:29:23.387 回答
8

α-β修剪

于 2008-12-20T00:46:51.770 回答
8

我用它来指定物理模拟中静态物体的质量和惯性。静态对象基本上不受重力和其他模拟力的影响。

于 2008-12-29T23:05:55.570 回答
6

在 Ruby 中,infinity 可用于实现惰性列表。假设我想要从 200 开始的 N 个数字,每次依次增大 100 个单位:

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

更多信息在这里:http ://banisterfiend.wordpress.com/2009/10/02/wtf-infinite-ranges-in-ruby/

于 2009-12-11T03:08:47.543 回答
5

我已经将它用于您想要定义偏好/允许范围的情况。

例如,在 37signals 应用程序中,您对项目数量有限制

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

然后你可以做检查

if PREMIUM.include? current_user.projects.count 
 # do something
end
于 2009-01-07T05:57:16.863 回答
4

我用它来表示相机焦距,令我惊讶的是在 Python 中:

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

我想知道为什么会这样。

于 2009-07-31T17:49:14.030 回答
3

我在minimax 算法中使用过它。当我生成新动作时,如果最小玩家在该节点上获胜,则该节点的值为 -∞。相反,如果最大玩家获胜,则该节点的值为 +∞。

此外,如果您正在生成节点/游戏状态,然后尝试几种启发式方法,您可以将所有节点值设置为 -∞/+∞,这很有意义,然后当您运行启发式方法时,很容易设置节点值:

node_val = -∞
node_val = max(heuristic1(node), node_val)
node_val = max(heuristic2(node), node_val)
node_val = max(heuristic2(node), node_val)
于 2008-12-22T13:56:57.557 回答
3

我在类似于 Rails 的 DSL 中使用过它,has_one并且has_many

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

这使得在您的 DSL 中表达 Kleene star 和 plus 等概念变得容易。

于 2008-12-29T22:14:52.960 回答
2

当我有一个 Range 对象的一端或两端需要打开时,我会使用它

于 2008-12-20T01:28:57.833 回答
2

我在处理范围比较时使用了正无穷和负无穷的符号值,以消除需要特殊处理的极端情况:

给定两个范围 A=[a,b) 和 C=[c,d) 它们是否相交,一个大于另一个,还是一个包含另一个?

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

如果您有分别比较大于和小于所有其他值的正无穷和负无穷值,则不需要对开放范围进行任何特殊处理。由于浮点数和双精度数已经实现了这些值,因此您不妨使用它们,而不是尝试在您的平台上找到最大/最小值。对于整数,使用“无穷大”更加困难,因为它不受硬件支持。

于 2009-01-07T22:04:54.557 回答
2

我遇到了这个问题,因为我正在寻找一个“无限”值来设置最大值,如果给定值不存在,则试图创建一个二叉树。(因为我是根据一系列值进行选择的,而不仅仅是一个值,所以我很快意识到在我的情况下,即使是哈希也行不通。)

因为我希望所有涉及的数字都是正数,所以最小值很容易:0。但是,由于我不知道最大值是什么,我希望上限是某种无穷大。这样,我就不必弄清楚我应该将事物与什么“最大值”进行比较。

由于这是我正在工作的一个项目,因此从技术上讲,它是一个“现实世界的问题”。它可能有点少见,但就像很多抽象一样,当你需要它时它很方便!

另外,对于那些说这个(和其他例子)是人为的人,我要指出所有的抽象都是人为的。这并不意味着当你设计它们时它们是有用的。

于 2010-04-13T20:18:39.107 回答
1

在使用三角(尤其是切线)的问题域中工作时,可以得出无穷大的答案。Trig 最终在图形应用程序、游戏和地理空间应用程序以及显而易见的数学应用程序中大量使用。

于 2008-12-20T00:01:33.140 回答
1

我确信还有其他方法可以做到这一点,但您可以使用 Infinity 检查字符串到浮点数转换中的合理输入。至少在 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的结果:false
这个数字太小了。

字符串表示:12345
isNaN 的结果:false
该数字是正确的。

字符串表示:999999999999999999999999999999999999999999999
isNaN的结果:false
这个数字太大了。

于 2008-12-20T00:19:37.067 回答
1

它在图形中被广泛使用。例如,3D 图像中不属于实际对象的任何像素都被标记为无限远。以便以后可以用背景图像替换它。

于 2009-01-13T14:49:21.350 回答
1

我正在使用一个网络库,您可以在其中指定重新连接尝试的最大次数。因为我希望我的永远重新连接:

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

在我看来,它比典型的“设置为 -1 以永久重试”样式更清楚,因为它的字面意思是“重试直到连接尝试的次数大于无穷大”。

于 2011-04-08T23:18:20.683 回答
0

一些程序员使用 Infinity 或NaNs 来显示一个变量从未在程序中被初始化或赋值。

于 2008-12-20T00:51:04.587 回答
0

如果您想要输入中的最大数字,但他们可能会使用非常大的负数。如果我输入-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))
于 2015-03-14T01:20:30.070 回答
-1

您可以使用:

import decimal
decimal.Decimal("Infinity")

或者:

from decimal import *
Decimal("Infinity")
于 2011-11-07T03:05:08.233 回答
-1

用于排序

我已经看到它用作排序值,说“总是将这些项目排序到底部”。

于 2014-08-22T14:04:23.103 回答
-1

指定不存在的最大值

如果您正在处理数字,nil则表示未知数量,并且在这种情况下应该首选0。同样,Infinity表示一个无限量,在这种情况下应该首选(arbitrarily_large_number)

我认为它可以使代码更干净。例如,我Float::INFINITY 在 Ruby gem中使用的正是:用户可以指定消息的最大字符串长度,或者他们可以指定:all. 在这种情况下,我将最大长度表示为Float::INFINITY,以便稍后当我检查“此消息是否比最大长度长?” 答案总是错误的,不需要特殊情况。

于 2015-03-19T14:28:04.773 回答