はじめに
この実験では、Java の double
型の値が正の無限大または負の無限大を表すかどうかをチェックする方法を学びます。これは、ゼロ除算など、標準的な数値範囲外の結果を生じる可能性のある浮動小数点数の計算を扱う際に重要なスキルです。
実践的な演習を通じて、Double.isInfinite()
メソッドを使用して無限大の値を識別し、ゼロ除算がどのように無限大につながるかを調べ、無限大の値と NaN
(非数値、Not-a-Number) の違いを理解します。
この実験では、Java の double
型の値が正の無限大または負の無限大を表すかどうかをチェックする方法を学びます。これは、ゼロ除算など、標準的な数値範囲外の結果を生じる可能性のある浮動小数点数の計算を扱う際に重要なスキルです。
実践的な演習を通じて、Double.isInfinite()
メソッドを使用して無限大の値を識別し、ゼロ除算がどのように無限大につながるかを調べ、無限大の値と NaN
(非数値、Not-a-Number) の違いを理解します。
このステップでは、Java の double
型の値が正の無限大または負の無限大を表すかどうかをチェックする方法を学びます。これは、ゼロ除算など、通常の浮動小数点数の範囲外の値を生じる可能性のある計算を扱う際に特に有用です。
Java では、この目的のために Double
クラスに isInfinite()
という組み込みメソッドが用意されています。
Double.isInfinite()
の使い方を示すために、簡単な Java プログラムを作成してみましょう。
HelloJava.java
ファイルが WebIDE エディタで開かれていない場合は、開きます。~/project
ディレクトリにいる必要があります。
ファイルの内容全体を次のコードに置き換えます。
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
を返します。結果はコンソールに出力されます。System.out.println
行では、negativeInfinity
と finiteNumber
に対して同じことを行っています。ファイルを保存します(Ctrl+S または Cmd+S)。
次に、プログラムをコンパイルしましょう。WebIDE の下部にあるターミナルを開き、~/project
ディレクトリにいることを確認します。次のコマンドを実行します。
javac HelloJava.java
コンパイルが成功すると、何も出力されません。
最後に、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()
を使って結果をチェックするために、プログラムを修正してみましょう。
WebIDE エディタで HelloJava.java
ファイルを開きます。~/project
ディレクトリにいる必要があります。
現在のコードを次のコードに置き換えます。
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()
を使って各結果が無限大かどうかをチェックしています。ファイルを保存します(Ctrl+S または Cmd+S)。
ターミナルで修正したプログラムをコンパイルします。
javac HelloJava.java
再び、出力がないことはコンパイルが成功したことを示します。
プログラムを実行します。
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()
がこれらの結果を正確に識別することが実証されます。ゼロをゼロでない数で割るとゼロになり、これは無限大ではありません。
前のステップでは、Double.isInfinite()
とゼロ除算が無限大をもたらす仕組みについて学びました。しかし、浮動小数点数の算術には「非数値」(Not a Number, NaN) と呼ばれる別の特殊な値があります。NaN は、ゼロをゼロで割る、または負の数の平方根を求めるなど、未定義または表現不可能な演算の結果を表します。
無限大の値と NaN を区別できることは重要です。なぜなら、これらは異なる種類の例外的な結果を表しているからです。Java では、double
型の値が NaN かどうかをチェックするための Double.isNaN()
メソッドが用意されています。
最後に、プログラムを修正して、NaN をもたらす計算を含め、無限大との区別の方法を見てみましょう。
WebIDE エディタで HelloJava.java
ファイルを開きます。~/project
ディレクトリにいる必要があります。
現在のコードを次のコードに置き換えます。
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()
の呼び出しを追加しています。ファイルを保存します(Ctrl+S または Cmd+S)。
ターミナルでプログラムをコンパイルします。
javac HelloJava.java
プログラムを実行します。
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_INFINITY
と Double.NEGATIVE_INFINITY
の値、および有限数でこのメソッドを使用する方法を見て、その動作を理解しました。このメソッドは、浮動小数点数の計算から生じる潜在的な無限大の結果を処理するために重要です。