数学の平方根では、負の数の平方根を求めると虚数解が得られます。しかし、Javaにはもともと虚数を表現する手段が含まれていません。そのため、Mathクラスにある平方根を求めるsqrtメソッドの引数に負の数を与えると「NaN」が返されます。これは、非数(Not a Number)を表すビットパターンであり、Java以外の言語でも採用されている表記方法です。
ある値がNaNかどうかは、Doubleクラス等のisNaN()メソッドで確認できますが、ここで問題なのは、「-2の平方根」も「-3の平方根」もNaNになってしまうため、NaNである式どうしは(例え同じ負の数の平方根であっても)絶対に「==」にならないということです。
よって、下記のように、変数xに「2の平方根」が代入されている場合には「x == Math.sqrt(2)」はtrueになりますが、変数xに「-2の平方根」が代入されている場合には「x == Math.sqrt(-2)」はtrueにならないのです。
小さなクラスを用いて解決
この状況において、xに「-2の平方根」が代入されている時にも「x == Math.sqrt(-2)」をtrueにしたい場合は、元の符号と絶対値の平方根を保持し、比較するメソッドをもつ小さなクラスを用います。
一例として、値を設定し平方根を保持するコンストラクタを持ち、equalsメソッドのオーバロードと、toStringメソッドのオーバライド、虚数かどうかを返すisNaNメソッドを持つNaNableSqrtクラスを作成すると以下のようになります。
このクラスを用いるように先ほどのプログラムを書き換えてみましょう。「-2の平方根どうしも等しい」ことを表現できます。
虚数どうしの加算乗除のメソッドを盛り込むなど、自由に機能アップできるのも、自前のクラスの利点です。Beans化もできますので、必要に応じて活用してみてください。
Copyright © ITmedia, Inc. All Rights Reserved.