Java で数値が無限大かどうかをチェックする方法

JavaJavaBeginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

この実験では、Java の double 型の値が正の無限大または負の無限大を表すかどうかをチェックする方法を学びます。これは、ゼロ除算など、標準的な数値範囲外の結果を生じる可能性のある浮動小数点数の計算を扱う際に重要なスキルです。

実践的な演習を通じて、Double.isInfinite() メソッドを使用して無限大の値を識別し、ゼロ除算がどのように無限大につながるかを調べ、無限大の値と NaN (非数値、Not-a-Number) の違いを理解します。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL java(("Java")) -.-> java/BasicSyntaxGroup(["Basic Syntax"]) java(("Java")) -.-> java/SystemandDataProcessingGroup(["System and Data Processing"]) java/BasicSyntaxGroup -.-> java/data_types("Data Types") java/BasicSyntaxGroup -.-> java/operators("Operators") java/SystemandDataProcessingGroup -.-> java/math_methods("Math Methods") java/SystemandDataProcessingGroup -.-> java/system_methods("System Methods") subgraph Lab Skills java/data_types -.-> lab-559964{{"Java で数値が無限大かどうかをチェックする方法"}} java/operators -.-> lab-559964{{"Java で数値が無限大かどうかをチェックする方法"}} java/math_methods -.-> lab-559964{{"Java で数値が無限大かどうかをチェックする方法"}} java/system_methods -.-> lab-559964{{"Java で数値が無限大かどうかをチェックする方法"}} end

Double.isInfinite() を使用したチェック

このステップでは、Java の double 型の値が正の無限大または負の無限大を表すかどうかをチェックする方法を学びます。これは、ゼロ除算など、通常の浮動小数点数の範囲外の値を生じる可能性のある計算を扱う際に特に有用です。

Java では、この目的のために Double クラスに isInfinite() という組み込みメソッドが用意されています。

Double.isInfinite() の使い方を示すために、簡単な Java プログラムを作成してみましょう。

  1. HelloJava.java ファイルが WebIDE エディタで開かれていない場合は、開きます。~/project ディレクトリにいる必要があります。

  2. ファイルの内容全体を次のコードに置き換えます。

    public class HelloJava {
        public static void main(String[] args) {
            double positiveInfinity = Double.POSITIVE_INFINITY;
            double negativeInfinity = Double.NEGATIVE_INFINITY;
            double finiteNumber = 10.0;
    
            System.out.println("Is positiveInfinity infinite? " + Double.isInfinite(positiveInfinity));
            System.out.println("Is negativeInfinity infinite? " + Double.isInfinite(negativeInfinity));
            System.out.println("Is finiteNumber infinite? " + Double.isInfinite(finiteNumber));
        }
    }

    このコードの新しい部分を見てみましょう。

    • double positiveInfinity = Double.POSITIVE_INFINITY;:この行では、double 型の変数を宣言し、正の無限大を表す特殊な値を代入しています。
    • double negativeInfinity = Double.NEGATIVE_INFINITY;:この行では、double 型の変数を宣言し、負の無限大を表す特殊な値を代入しています。
    • double finiteNumber = 10.0;:この行では、有限の値を持つ通常の double 型の変数を宣言しています。
    • System.out.println("Is positiveInfinity infinite? " + Double.isInfinite(positiveInfinity));:この行では、positiveInfinity を引数として Double.isInfinite() メソッドを呼び出しています。このメソッドは、値が無限大(正または負)の場合は true を返し、それ以外の場合は false を返します。結果はコンソールに出力されます。
    • 次の 2 つの System.out.println 行では、negativeInfinityfiniteNumber に対して同じことを行っています。
  3. ファイルを保存します(Ctrl+S または Cmd+S)。

  4. 次に、プログラムをコンパイルしましょう。WebIDE の下部にあるターミナルを開き、~/project ディレクトリにいることを確認します。次のコマンドを実行します。

    javac HelloJava.java

    コンパイルが成功すると、何も出力されません。

  5. 最後に、java コマンドを使用してコンパイルされたプログラムを実行します。

    java HelloJava

    次のような出力が表示されるはずです。

    Is positiveInfinity infinite? true
    Is negativeInfinity infinite? true
    Is finiteNumber infinite? false

この出力から、Double.isInfinite() が正の無限大と負の無限大の両方を正しく識別し、通常の有限数に対しては false を返すことが確認できます。

ゼロ除算によるテスト

前のステップでは、Double.isInfinite() が事前定義された無限大の値でどのように動作するかを見ました。今度は、計算で無限大が発生する一般的なシナリオ、つまりゼロ除算を調べてみましょう。

標準的な算術では、ゼロ除算は定義されていません。しかし、浮動小数点数の算術(double 型が使用する算術)では、ゼロでない数をゼロで割ると、分子の符号に応じて正の無限大または負の無限大になります。ゼロをゼロで割る、または無限大を無限大で割ると、「非数値」(Not a Number, NaN) と呼ばれる特殊な値になります。これについては次のステップで説明します。

ゼロ除算を実演し、Double.isInfinite() を使って結果をチェックするために、プログラムを修正してみましょう。

  1. WebIDE エディタで HelloJava.java ファイルを開きます。~/project ディレクトリにいる必要があります。

  2. 現在のコードを次のコードに置き換えます。

    public class HelloJava {
        public static void main(String[] args) {
            double positiveResult = 10.0 / 0.0;
            double negativeResult = -10.0 / 0.0;
            double zeroResult = 0.0 / 10.0;
    
            System.out.println("Result of 10.0 / 0.0: " + positiveResult);
            System.out.println("Is 10.0 / 0.0 infinite? " + Double.isInfinite(positiveResult));
    
            System.out.println("Result of -10.0 / 0.0: " + negativeResult);
            System.out.println("Is -10.0 / 0.0 infinite? " + Double.isInfinite(negativeResult));
    
            System.out.println("Result of 0.0 / 10.0: " + zeroResult);
            System.out.println("Is 0.0 / 10.0 infinite? " + Double.isInfinite(zeroResult));
        }
    }

    この新しいコードでは次のことが行われています。

    • double positiveResult = 10.0 / 0.0;:正の数 (10.0) をゼロ (0.0) で割っています。浮動小数点数の算術では、これは正の無限大になります。
    • double negativeResult = -10.0 / 0.0;:負の数 (-10.0) をゼロ (0.0) で割っています。これは負の無限大になります。
    • double zeroResult = 0.0 / 10.0;:ゼロ (0.0) をゼロでない数 (10.0) で割っています。これはゼロになり、有限の数です。
    • その後、これらの除算の結果を出力し、Double.isInfinite() を使って各結果が無限大かどうかをチェックしています。
  3. ファイルを保存します(Ctrl+S または Cmd+S)。

  4. ターミナルで修正したプログラムをコンパイルします。

    javac HelloJava.java

    再び、出力がないことはコンパイルが成功したことを示します。

  5. プログラムを実行します。

    java HelloJava

    次のような出力が表示されるはずです。

    Result of 10.0 / 0.0: Infinity
    Is 10.0 / 0.0 infinite? true
    Result of -10.0 / 0.0: -Infinity
    Is -10.0 / 0.0 infinite? true
    Result of 0.0 / 10.0: 0.0
    Is 0.0 / 10.0 infinite? false

これにより、ゼロでない浮動小数点数をゼロで割ると正しく無限大(正または負)になり、Double.isInfinite() がこれらの結果を正確に識別することが実証されます。ゼロをゼロでない数で割るとゼロになり、これは無限大ではありません。

無限大と NaN を区別する

前のステップでは、Double.isInfinite() とゼロ除算が無限大をもたらす仕組みについて学びました。しかし、浮動小数点数の算術には「非数値」(Not a Number, NaN) と呼ばれる別の特殊な値があります。NaN は、ゼロをゼロで割る、または負の数の平方根を求めるなど、未定義または表現不可能な演算の結果を表します。

無限大の値と NaN を区別できることは重要です。なぜなら、これらは異なる種類の例外的な結果を表しているからです。Java では、double 型の値が NaN かどうかをチェックするための Double.isNaN() メソッドが用意されています。

最後に、プログラムを修正して、NaN をもたらす計算を含め、無限大との区別の方法を見てみましょう。

  1. WebIDE エディタで HelloJava.java ファイルを開きます。~/project ディレクトリにいる必要があります。

  2. 現在のコードを次のコードに置き換えます。

    public class HelloJava {
        public static void main(String[] args) {
            double positiveInfinity = 10.0 / 0.0;
            double nanResult = 0.0 / 0.0;
            double finiteNumber = 5.0;
    
            System.out.println("Result of 10.0 / 0.0: " + positiveInfinity);
            System.out.println("Is 10.0 / 0.0 infinite? " + Double.isInfinite(positiveInfinity));
            System.out.println("Is 10.0 / 0.0 NaN? " + Double.isNaN(positiveInfinity));
    
            System.out.println("Result of 0.0 / 0.0: " + nanResult);
            System.out.println("Is 0.0 / 0.0 infinite? " + Double.isInfinite(nanResult));
            System.out.println("Is 0.0 / 0.0 NaN? " + Double.isNaN(nanResult));
    
            System.out.println("Result of 5.0: " + finiteNumber);
            System.out.println("Is 5.0 infinite? " + Double.isInfinite(finiteNumber));
            System.out.println("Is 5.0 NaN? " + Double.isNaN(finiteNumber));
        }
    }

    変更点の内訳は次の通りです。

    • double positiveInfinity = 10.0 / 0.0;:正の無限大をもたらす除算を維持しています。
    • double nanResult = 0.0 / 0.0;:この行ではゼロをゼロで割る演算を行っており、結果は NaN になります。
    • double finiteNumber = 5.0;:比較用の通常の有限数です。
    • 各結果に対して、Double.isInfinite() に加えて Double.isNaN() の呼び出しを追加しています。
  3. ファイルを保存します(Ctrl+S または Cmd+S)。

  4. ターミナルでプログラムをコンパイルします。

    javac HelloJava.java
  5. プログラムを実行します。

    java HelloJava

    次のような出力が表示されるはずです。

    Result of 10.0 / 0.0: Infinity
    Is 10.0 / 0.0 infinite? true
    Is 10.0 / 0.0 NaN? false
    Result of 0.0 / 0.0: NaN
    Is 0.0 / 0.0 infinite? false
    Is 0.0 / 0.0 NaN? true
    Result of 5.0: 5.0
    Is 5.0 infinite? false
    Is 5.0 NaN? false

この出力から、無限大の値と NaN の違いが明確にわかります。Double.isInfinite() は正または負の無限大の場合にのみ true を返し、Double.isNaN() は NaN の場合にのみ true を返します。有限数に対しては、両方のメソッドが false を返します。この区別を理解することは、浮動小数点数の計算で潜在的なエラーや予期しない結果を処理するために重要です。

まとめ

この実験では、Java の double 型の値が正または負の無限大を表すかどうかを Double.isInfinite() メソッドを使ってチェックする方法を学びました。事前定義された Double.POSITIVE_INFINITYDouble.NEGATIVE_INFINITY の値、および有限数でこのメソッドを使用する方法を見て、その動作を理解しました。このメソッドは、浮動小数点数の計算から生じる潜在的な無限大の結果を処理するために重要です。