web-dev-qa-db-ja.com

プログラミング言語はどのような状況でInfinity値を実際に利用しますか?

したがって、Rubyには、無限大を指定するためのトリックがあります。

1.0/0
=> Infinity

私はPythonあなたはこのようなことをすることができると信じています

float('inf')

これらは単なる例ですが、ほとんどの言語にはある程度の容量が無限大にあると確信しています。現実の世界で実際にこの構成を使用するのはいつですか?ブール式を使用するよりも、範囲内で使用する方が良いのはなぜですか?例えば

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

要約すると、私が探しているのは、Infinityを使用する実際の理由です。

[〜#〜] edit [〜#〜]:実世界のコードを探しています。これは、あなたがそれを「使用できた」とき、人々が実際に使用したときであると言うのは良いことです。

28
Chris Lloyd

ダイクストラのアルゴリズムは通常、グラフの初期エッジの重みとして無限大を割り当てます。これはhaveが「無限大」ではなく、任意に一定であるだけですが、Java私は通常、Double.Infinityを使用します。Ruby同様に使用できます。

34
mmcdole

頭のてっぺんから、最小値を検索するときの初期値として役立ちます。

例えば:

min = float('inf')

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

最初にminsomelistの最初の値に設定することを好みます

もちろん、Pythonでは、ほとんどの場合、min()組み込み関数を使用する必要があります。

34
Triptych

「なぜこの機能が存在するのか」という暗示があるようです。あなたの質問で。その理由は、RubyおよびPythonは、IEEEで指定されている浮動小数点形式で指定できる値の全範囲へのアクセスを提供しているだけだからです。

このページはそれをうまく説明しているようです: http://steve.hollasch.net/cgindex/coding/ieeefloat.html

その結果、NaN(Not-a-number)値と-0.0を使用することもできますが、これらの値をすぐに実際に使用することはできません。

17
InfiniteVoid

一部の物理計算では、同じ次数の不規則性(つまり、無限の数)を互いに正規化し、両方をキャンセルして、おおよその結果を得ることができます。

限界を扱うとき、(無限大/無限大)->有限数に近づくような計算が達成される可能性があります。言語には、通常のゼロ除算エラーを上書きする機能があると便利です。

11
Eran Galperin

数学アルゴリズムを実装する場合は、Infinity-Infinityを使用してください。

Rubyでは、Infinity-Infinityには優れた比較プロパティがあるため、任意の実数xに対して-Infinity <Infinity <x。たとえば、Math.log(0)-Infinityを返し、0Math.log(x) > Math.log(y)を意味するプロパティをx > yに拡張します。また、Infinity * xはx> 0の場合はInfinity、x <0の場合は-Infinity、xが0の場合は「NaN」(数値ではない、つまり未定義)です。

たとえば、いくつかの 対数尤度比 の計算の一部で次のコードを使用します。 k-Infinityまたはnであり、x0または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
10
Bkkbrad

物理シミュレーションで静的オブジェクトの質量と慣性を指定するために使用します。静的オブジェクトは、重力やその他のシミュレーション力の影響を本質的に受けません。

8
Nick Van Brunt
8
pantsgolem

In Ruby無限大を使用して、レイジーリストを実装できます。200から始まり、毎回100単位ずつ連続的に大きくなるN個の数値が必要だとします。

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

詳細はこちら: http://banisterfiend.wordpress.com/2009/10/02/wtf-infinite-ranges-in-Ruby/

6
horseyguy

設定/許可の範囲を定義したい場合に使用しました。

たとえば、37signalsアプリでは、プロジェクト数に制限があります

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

その後、次のようなチェックを行うことができます

if PREMIUM.include? current_user.projects.count 
 # do something
end
5
ucron

私はそれをカメラの焦点距離を表すために使用し、Pythonで驚いたことに:

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

なんでだろうか。

4
dhill

Railsのhas_onehas_manyに似たDSLで使用しました。

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

これにより、DSLでクリーネ閉包やプラスなどの概念を簡単に表現できます。

3
James A. Rosen

ミニマックスアルゴリズム で使用しました。私が新しい動きを生成しているとき、最小プレーヤーがそのノードで勝った場合、ノードの値は-∞です。逆に、最大プレーヤーが勝った場合、そのノードの値は+∞です。

また、ノード/ゲームの状態を生成してからいくつかのヒューリスティックを試す場合は、すべてのノード値を-∞/ +∞に設定できます。これは理にかなっています。ヒューリスティックを実行しているときは、ノード値を簡単に設定できます。 :

node_val = -∞
node_val = max(heuristic1(node), node_val)
node_val = max(heuristic2(node), node_val)
node_val = max(heuristic2(node), node_val)
3
Lolindrath

範囲の比較を処理する際に正と負の無限大の記号値を使用して、特別な処理が必要になるコーナーケースを排除しました。

2つの範囲A = [a、b)とC = [c、d)が与えられた場合、それらは交差しますか、一方が他方よりも大きいか、または一方が他方を含みますか?

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

正の無限大と負の無限大の値がそれぞれ他のすべての値よりも大きい値と小さい値を比較している場合は、制限のない範囲に対して特別な処理を行う必要はありません。 floatとdoubleはすでにこれらの値を実装しているので、プラットフォームで最大/最小の値を見つけようとする代わりに、それらを使用する方がよいでしょう。整数の場合、ハードウェアでサポートされていないため、「無限大」を使用するのはより困難です。

2
Eclipse

バイナリツリーを作成しようとして、特定の値が存在しない場合に最大値を設定するための「無限」の値を探しているため、これに遭遇しました。 (単一の値だけでなく、値の範囲に基づいて選択しているため、ハッシュでさえ私の状況では機能しないことにすぐに気付きました。)

関係するすべての数値が正であると期待しているので、最小値は簡単です:0。ただし、最大値に何を期待するかわからないので、上限をある種の無限大にしたいと思います。このように、私は物事を比較する必要がある「最大」を理解する必要はありません。

これは私が仕事で取り組んでいるプロジェクトなので、技術的には「現実世界の問題」です。まれなことかもしれませんが、多くの抽象化と同様に、必要なときに便利です。

また、これ(および他の例)が考案されていると言う人には、私はそれを指摘します すべて 抽象化はやや工夫されています。それはあなたがそれらを考案するときにそれらが有用であるという意味ではありません。

2
alpheus

三角法が使用されている問題領域(特に接線)で作業する場合、無限大が出てくる可能性のある答えです。 Trigは、グラフィックアプリケーション、ゲーム、地理空間アプリケーションに加えて、明らかな数学アプリケーションで頻繁に使用されることになります。

1
John Meagher

グラフィックスで非常に広く使用されています。たとえば、実際のオブジェクトの一部ではない3D画像のピクセルは、無限遠としてマークされます。後で背景画像に置き換えることができるようにします。

1
Megamug

再接続の最大試行回数を指定できるネットワークライブラリを使用しています。私は永遠に再接続したいので:

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

私の意見では、文字通り「接続の試行回数が無限大になるまで再試行する」と言っているため、通常の「-1に設定して永久に再試行する」スタイルよりも明確です。

1
Brendan Long

これを行う方法は他にもあると思いますが、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
その番号は正解です。

文字列表現:99999999999999999999999999999999999999999999999
isNaNの結果:false
その数は大きすぎます。

1
William Brendel

入力から最大の数値が必要であるが、非常に大きなネガを使用する可能性がある場合。 -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))
0
cybervigilante

一部のプログラマーは、InfinityまたはNaNsを使用して、変数がプログラムで初期化または割り当てられていないことを示します。

0
Juan