Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

Rubyの無限大(Infinity)とは?仕組みと実践的な使い方を徹底解説

Rubyにおける「無限大」とは何でしょうか?

それは「始まりはあるけれど、終わりがない」という概念のことです。

Rubyでは、Float::INFINITY という定数を使うことで、この無限大を表現できます。

「実際にどんな場面で役立つのか?」と疑問に思う方も多いはず。この記事では、具体的なコード例とともに、Rubyの無限大の仕組みと実践的な使い方をわかりやすく解説します。

演算の結果として現れる無限大

実はRubyでは、特定の数値演算を行うと、その結果として Infinity オブジェクトが返されることがあります。

たとえば、「0による除算」のエラーをご存じの方も多いでしょう。

1/0
# ZeroDivisionError: divided by 0

しかし、浮動小数点数(Float)を使うと、挙動が変わります。

1/0.0
# Infinity

なんと Infinity が返ってきました。エラーにはならないのです。

さらに、00.0 で割ると、今度は別の特殊な値が登場します。

0/0.0
# NaN

このNaNとは何なのでしょうか?

NaNは「Not a Number(非数)」の略で、「数値として定義できない値」を意味します。筆者の知る限り、Rubyの中でこの値が現れるのはここだけです。

なぜこんな値が存在するのでしょう?

それは、浮動小数点演算の挙動を定める国際規格「IEEE 754」の仕様の一部だからです。RubyのFloatはこの規格に準拠しているため、こうした特殊な値が定義されています。

ちなみに、関連する便利なメソッドもあります

  • nan? — NaNかどうかを判定
  • finite? — 有限の数値かどうかを判定
  • infinite? — 無限大かどうかを判定

これらのメソッドを使えば、対象が特殊な値かどうかを簡単にチェックできます。いずれもFloatオブジェクトで利用可能です。

さらにRuby 2.4以降では、Integerに対しても finite?infinite? が使えるようになりました。

無限Range(範囲オブジェクト)の作り方

次に、Range(範囲オブジェクト)での活用例を見てみましょう。

以下は無限Rangeの例です

(1..Float::INFINITY).take(10)
# [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

終わりが事前にわからない場合でも、必要な分だけ要素を取り出せるので非常に便利です。

ただし、ひとつ注意点があります。開始値として使えるのは数値だけだということです。

例を見てみましょう

("a"..Float::INFINITY)
# ArgumentError: bad value for range

では、どう解決すればいいのでしょうか?

Ruby 2.6以降なら、次のように書けます

("a"..).take(5)
# ["a", "b", "c", "d", "e"]

そう、これは書き間違いではありません! このRangeには終了値がなく、開始値 "a" のあとにドット2つ .. を続けるだけで、終わりのないRangeになるのです。

これは新しい構文(始端のみを指定する記法)なので、動作させるにはRuby 2.6以上が必要です。

最大値・最小値の初期値として無限大を使う

Infinity のもうひとつの実用的な使い方は何でしょうか?

実は、Float::INFINITY はRubyにおける最大の数値であり、-Float::INFINITY は最小の数値です。

これを「比較処理の初期値」として活用できます。

以下はその実例です

def smallest_percent_size(style, ary_size)
  @smallest_percent ||= Float::INFINITY

  if style == :percent && ary_size < @smallest_percent
    @smallest_percent = ary_size
  end

  @smallest_percent
end

このコードは、オープンソースプロジェクト「RuboCop」から引用したものです。

仕組みを解説します

このコードは最小の配列サイズを求めようとしていますが、そのためには比較の起点となる初期値が必要です。nil を使うとエラーになってしまいます。

「十分に大きな数値」を直接書いて、それで足りることを祈ることもできますが…

Float::INFINITY を使えば、「それより大きい数値は存在しない」ことが保証されているため、どんな入力にも対応できる安全な初期値になります。

まとめ

この記事では、Rubyにおける無限大について、その正体、どこで現れるのか、そしてどう活用するのかを学びました。

  • Float::INFINITY で無限大を表現できる
  • Float同士の除算では ZeroDivisionError ではなく Infinity や NaN が返る
  • 無限Rangeや最大・最小値の初期値として実用的に使える

この記事が役に立ったら、ぜひ周りの人にもシェアしてください。

最後までお読みいただき、ありがとうございました!

  1. Ruby on Railsとは?初心者にもわかる仕組み・魅力・学び方を徹底解説

    Ruby on Railsとは? Ruby on Rails(略称:RoR)は、世界で最も人気のあるオープンソースのWebアプリケーションフレームワークです。プログラミング言語「Ruby」をベースに構築されており、シンプルなサイトから大規模で複雑なサービスまで、幅広いWebアプリケーションの開発を支援します。 そもそもフレームワークとは? フレームワークとは、ソフトウェア開発の際に土台となる構造を提供してくれるコードやツール、ユーティリティの集合体です。あらかじめ用意された構造に沿ってコードを書くことで、プログラムが整理され、保守性も高まります。正しく使いこなせるようになれば、開発作業は格段に

  2. RubyのStructとOpenStructの使い方を徹底解説!値オブジェクトを簡単に作る方法

    Rubyには、関連する属性をまとめて保持する「値オブジェクト」を手軽に作れるStructという組み込みクラスが用意されています。本記事では、Structの基本的な使い方から注意点、そしてOpenStructとの違いまで詳しく解説します。 そもそもStructとは何か? StructはRubyに組み込まれたクラスで、新しいクラスを動的に生成し、値オブジェクト(Value Object)を作成するために使われます。値オブジェクトとは、関連性のある複数の属性をひとまとめにして扱うためのオブジェクトです。 具体例を挙げてみましょう。 2つの座標(xとy)を持つPointというデータを表したい場合、この