ここから本文です

Java(VC でも可)で、自作の数字クラスを作りたいです。

int********さん

2011/3/2616:07:00

Java(VC でも可)で、自作の数字クラスを作りたいです。

今、Javaで、メモリが許す限り大きな数字でも取り扱えるクラスを作りたいと思っています。
自然数<->整数<->分数(有限小数)という風に、作りたいと思っています。

可能ならば、無理数や複素数(代数的数)なども扱いたいので、
Numberというインターフェイス(もしくは抽象クラス)で管理したいです。

自然数のクラスをNaturalNumber、
整数のクラスをIntegerNumber、
分数のクラスをRationalNumberという名前にしたとき、
すべてをNumberというインターフェイス(または抽象クラス)で管理され、かつ
次のメソッド群をうまく整理するには、どうしたらいいでしょうか?

public NaturalNumber sum(NaturalNumber m, NaturalNumber n);
public IntegerNumber sum(IntegerNumber m, NaturalNumber n);
public IntegerNumber sum(NaturalNumber m, IntegerNumber n);
public RationalNumber sum(RationalNumber m, NaturalNumber n);
public RationalNumber sum(RationalNumber m, IntegerNumber n);
public RationalNumber sum(RationalNumber m, RationalNumber n);

また、
NaturalNumber->IntegerNumber
NaturalNumber->RationalNumber
IntegerNumber->RationalNumber
へのキャストも、無駄なくキャストしたいです。
(sum(NaturalNumber m, NaturalNumber n)を
m,nをともにRationalNumberにキャストしてsumを作用させるというのはなしでおねがいします。)

今は3つのクラスでの例を出しましたが、
今後もこのような関係性のあるクラスを10個ほどまで増やしていきたいので、
全ソースに書くということをせずに、
効率的にコーディングをし、リソースを無駄にしないようにして欲しいです。


いずれはC++(VC++2008上で走らせる)でも書きたいですが、
できるだけJavaで書くことのできる方法を教えていただきたいです。
(Javaで出来るなら、C++でも出来ると思っている印象ですので。)

条件が厳しいですが、Java(もしくはVC++)で出来ることなのかがわかりませんので、
どなたか教えていただけないでしょうか?

補足最終的には、文字列で表された複素数係数関数(多項式)を計算したいのですが、
その係数をトータル的に管理したいのです。
有理数(無限小数)は、丸め誤差で正確な計算が出来ないので、
1/3を0.3333...ではなく、あるクラスで{1,3}のように保存しておきたいのです。
(最後の計算で正確な近似値を出したい、2進で保存すると精度が悪くなるから。)

あと、BigDecimal等のソースが見れる方法(もしくはサイト)はありますか?

閲覧数:
251
回答数:
1
お礼:
250枚

違反報告

ベストアンサーに選ばれた回答

makoさん

2011/3/2620:19:22

> 今、Javaで、メモリが許す限り大きな数字でも取り扱えるクラスを作りたいと思っています。
> 自然数<->整数<->分数(有限小数)という風に、作りたいと思っています。

Java標準のクラスではだめなのでしょうか?
(BigInteger,BigDecimalで充分では?)

自分で作成したいのであれば、JavaのBigDecimal等の実装を参考にしてはいかがでしょうか?

> すべてをNumberというインターフェイス(または抽象クラス)で管理され、かつ
> 次のメソッド群をうまく整理するには、どうしたらいいでしょうか?

Numberインターフェースか抽象クラスで全てを管理するのはよくないと思います。
Numberに子クラスで実装すべきメソッドを作成すると、
子クラスが増えるごとに親クラスのメソッドを増やすなど不格好になります。

少なくとも、以下のメソッドはNumberインターフェースではなく、
それぞれの子クラスに実装させるか、ユーティリティクラスに実装させるのがよろしいと思います。

また、引数が二つなので、二つの数を足した値を返すメソッドに見えますが、
であればstaticメソッドでもいい気がするので、余計にユーティリティっぽい気がします。

> public NaturalNumber sum(NaturalNumber m, NaturalNumber n);
> public IntegerNumber sum(IntegerNumber m, NaturalNumber n);
> public IntegerNumber sum(NaturalNumber m, IntegerNumber n);
> public RationalNumber sum(RationalNumber m, NaturalNumber n);
> public RationalNumber sum(RationalNumber m, IntegerNumber n);
> public RationalNumber sum(RationalNumber m, RationalNumber n);


> また、
> NaturalNumber->IntegerNumber
> NaturalNumber->RationalNumber
> IntegerNumber->RationalNumber
> へのキャストも、無駄なくキャストしたいです。
> (sum(NaturalNumber m, NaturalNumber n)を
> m,nをともにRationalNumberにキャストしてsumを作用させるというのはなしでおねがいします。)


そもそもキャストではない気がしますが、メソッドで計算したものをキャストするか、
IntegerNumberクラスにtoNaturalNumberみたいなメソッドを作成すればいいと思います。

質問した人からのコメント

2011/4/2 19:14:08

降参 ありがとうございました。
無理に抽象クラスやインターフェイスにしようと思わず、
地道にコーディングをしていきたいと思います。
うまい方法がないようなので、コーディングミスに気をつけながら挑戦していきたいと思います。

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる