検索
連載

虚数どうしの比較をしたいときのクラスの活用法JavaTips 〜Javaプログラミング編

Share
Tweet
LINE
Hatena

 数学の平方根では、負の数の平方根を求めると虚数解が得られます。しかし、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にならないのです。

「2の平方根」どうしは等しいが、「-2の平方根」どうしは等しくならない
「2の平方根」どうしは等しいが、「-2の平方根」どうしは等しくならない

小さなクラスを用いて解決

 この状況において、xに「-2の平方根」が代入されている時にも「x == Math.sqrt(-2)」をtrueにしたい場合は、元の符号と絶対値の平方根を保持し、比較するメソッドをもつ小さなクラスを用います。

 一例として、値を設定し平方根を保持するコンストラクタを持ち、equalsメソッドのオーバロードと、toStringメソッドのオーバライド、虚数かどうかを返すisNaNメソッドを持つNaNableSqrtクラスを作成すると以下のようになります。

元の符号と絶対値の平方根を保持し、比較するメソッドをもつ小さなクラスNaNableSqrt
元の符号と絶対値の平方根を保持し、比較するメソッドをもつ小さなクラスNaNableSqrt

 このクラスを用いるように先ほどのプログラムを書き換えてみましょう。「-2の平方根どうしも等しい」ことを表現できます。

「2の平方根」どうしは等しく、「-2の平方根」どうしも等しい
「2の平方根」どうしは等しく、「-2の平方根」どうしも等しい

 虚数どうしの加算乗除のメソッドを盛り込むなど、自由に機能アップできるのも、自前のクラスの利点です。Beans化もできますので、必要に応じて活用してみてください。

Profile

RunDog.org

平野正喜


Copyright © ITmedia, Inc. All Rights Reserved.

ページトップに戻る