プログラミング言語はどのような状況で実際に Infinity 値を使用するのでしょうか?
-
23-08-2019 - |
質問
したがって、Ruby では無限大を指定するためのトリックがあります。
1.0/0
=> Infinity
Python ではこのようなことができると思います
float('inf')
ただし、これらは単なる例であり、ほとんどの言語にはある意味無限があると思います。現実の世界でこの構造を実際に使用するのはいつですか?単にブール式を使用するよりも範囲内で使用する方が良いのはなぜですか?例えば
(0..1.0/0).include?(number) == (number >= 0) # True for all values of number
=> true
要約すると、私が探しているのは、Infinity を使用する現実的な理由です。
編集:現実世界のコードを探しています。人がいるとき、それを「使える」ときだと言うのは、まったく問題ありません。 実は それを使った。
解決
ダイクストラのアルゴリズムは通常、グラフの初期エッジの重みとして無限大を割り当てます。これは「無限大」である必要はなく、任意に一定である必要がありますが、Javaでは通常Double.Infinityを使用します。ルビーも同じように使えると思います。
他のヒント
頭のてっぺんから、最小値を検索するときの初期値として役立ちます。
例: ジェネラコディセタグプレ
最初に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
は Infinity
if x>0の -Infinity
xの場合 < 0'NaN'ではない番号それは、未定義の場合、xは0になります。
例えば、以下の少しのコードの一部では、計算の一部 ログの可能性比率.私は明示的に参照 -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
物理シミュレーションで静的オブジェクトの質量と慣性を指定するために使用します。静的オブジェクトは、重力やその他のシミュレーション力の影響を本質的に受けません。
Rubyでは、インフィニティを使用してレイジーリストを実装できます。200から始まり、毎回100単位ずつ大きくなるN個の数値が必要だとします。 ジェネラコディセタグプレ
詳細はこちら: http:// banisterfiend.wordpress.com / 2009/10/02 / wtf-infinite-ranges-in-ruby /
設定/許可の範囲を定義したい場合に使用しました。
たとえば、37signalsアプリでは、プロジェクト数に制限があります ジェネラコディセタグプレ
次に、のようなチェックを行うことができます ジェネラコディセタグプレ
カメラの焦点距離を表すために使用しましたが、Pythonで驚いたことに: ジェネラコディセタグプレ
それはなぜだろうか。
ミニマックスアルゴリズムで使用しました。私が新しい動きを生成しているとき、最小プレーヤーがそのノードで勝った場合、ノードの値は-∞です。逆に、最大プレーヤーが勝った場合、そのノードの値は+∞です。
また、ノード/ゲームの状態を生成してからいくつかのヒューリスティックを試す場合は、すべてのノード値を-∞/ +∞に設定できます。これは理にかなっています。ヒューリスティックを実行しているときは、簡単に設定できます。ノード値: ジェネラコディセタグプレ
Railsのhas_one
やhas_many
に似たDSLで使用しました:
ジェネラコディセタグプレ
これにより、DSLでクリーネ閉包やプラスなどの概念を簡単に表現できます。
一方または両方の端を開く必要があるRangeオブジェクトがある場合に使用します
範囲の比較を処理する際に正と負の無限大の記号値を使用して、特別な処理が必要になるコーナーケースを排除しました:
2つの範囲A= [a、b)とC= [c、d)が与えられた場合、それらは交差しますか、一方が他方よりも大きいか、または一方が他方を含みますか? ジェネラコディセタグプレ
他のすべての値よりも大きい値と小さい値をそれぞれ比較する正の無限大と負の無限大の値がある場合は、自由形式の範囲に対して特別な処理を行う必要はありません。floatとdoubleはすでにこれらの値を実装しているため、プラットフォームで最大/最小の値を見つけようとする代わりに、それらを使用することをお勧めします。整数の場合、ハードウェアでサポートされていないため、「無限大」を使用するのはより困難です。
二分木を作成しようとして、指定された値が存在しない場合に最大値を設定するための「無限」の値を探しているため、これに遭遇しました。(単一の値だけでなく、値の範囲に基づいて選択しているため、ハッシュでさえ自分の状況では機能しないことにすぐに気付きました。)
関係するすべての数値が正であると期待しているので、最小値は簡単です:0。最大値に何を期待するかわからないので、上限をある種の無限大にしたいと思います。このように、私は物事を比較する必要がある「最大」を理解する必要はありません。
これは私が仕事で取り組んでいるプロジェクトなので、技術的には「現実世界の問題」です。まれなことかもしれませんが、多くの抽象化のように、必要なときに便利です!
また、これ(および他の例)が考案されていると言う人には、すべての抽象化がやや考案されていることを指摘しておきます。それはあなたがそれらを考案するときにそれらが有用であるという意味ではありません。
三角法が使用されている(特にタンジェント)問題領域で作業する場合、無限大が出てくる可能性のある答えです。Trigは、グラフィックアプリケーション、ゲーム、地理空間アプリケーションに加えて、明らかな数学アプリケーションで頻繁に使用されることになります。
これを行う方法は他にもあると思いますが、Infinityを使用して、文字列から浮動小数点数への変換で適切な入力を確認できます。Javaでは、少なくとも、Float.isNaN()静的メソッドは無限の大きさの数値に対してfalseを返し、プログラムがそれらを無効として分類したい場合でも、それらが有効な数値であることを示します。Float.POSITIVE_INFINITY定数とFloat.NEGATIVE_INFINITY定数をチェックすると、その問題が解決します。例: ジェネラコディセタグプレ
出力例:
文字列表現:-999999999999999999999999999999999999999999999
isNaNの結果:false
その数は少なすぎます。
文字列表現:12345
isNaNの結果:false
その数は正解です。
文字列表現:99999999999999999999999999999999999999999999999
isNaNの結果:false
その数は大きすぎます。
グラフィックスで非常に広く使用されています。たとえば、実際のオブジェクトの一部ではない3D画像のピクセルは、無限遠としてマークされます。後で背景画像に置き換えることができるようにします。
再接続試行の最大回数を指定できるネットワーク ライブラリを使用しています。私は永遠に再接続したいので、
my_connection = ConnectionLibrary(max_connection_attempts = float('inf'))
私の意見では、文字通り「接続試行回数が無限大を超えるまで再試行する」ことを意味するため、典型的な「永久に再試行するには -1 に設定する」スタイルよりも明確です。
一部のプログラマーは、InfinityまたはNaN
sを使用して、変数がプログラムで初期化または割り当てられていないことを示します。
入力から最大の数値が必要であるが、非常に大きなネガを使用する可能性がある場合。-13543124321.431と入力すると、-infより大きいため、最大数として機能します。 ジェネラコディセタグプレ
並べ替え用
「これらのアイテムは常に一番下に並べ替える」という意味で、並べ替え値として使用されているのを見てきました。
存在しない最大値を指定するには
数字を扱っている場合、nil
は不明な数量を表しているため、その場合は0
よりも優先する必要があります。同様に、Infinity
は無制限の量を表し、その場合は(arbitrarily_large_number)
よりも優先されます。
コードをすっきりさせることができると思います。たとえば、RubygemでFloat::INFINITY
を使用しています。>まさにそのために:ユーザーはメッセージの最大文字列長を指定するか、:all
を指定することができます。その場合、最大長をFloat::INFINITY
として表すので、後で「このメッセージは最大長よりも長いですか?」をチェックします。特別な場合を必要とせずに、答えは常に偽になります。
使用できるもの: ジェネラコディセタグプレ
または: ジェネラコディセタグプレ