Index: [Article Count Order] [Thread]

Date:  Wed, 12 Mar 2003 22:55:24 +0900
From:  cabva301@....jp (渡辺 義則)
Subject:  [XP-jp:04205] Re: 浮動小数点演算や幾何演算のテスト
To:  extremeprogramming-jp@....jp
Message-Id:  <200303121355.AA00027@....jp>
In-Reply-To:  <20030312141250.0476.TERADA@....jp>
References:  <20030312141250.0476.TERADA@....jp>
X-Mail-Count: 04205

渡辺です。

>例1)ベクトルクラスのテスト
>  CPPUNIT_ASSERT( inner_product( a, c ) == 0.0 ) ;  // ダメ!
>  CPPUNIT_ASSERT( inner_product( b, c ) == 0.0 ) ;  // ダメ!

数学上はその式であっているでしょうが、プログラムでは無限の精度は持っていません。
「その関数がどの程度の精度で成り立つのかを定義し、そのテストを行うべき」
だと考えます。
つまり、その関数が、1.0e-4以内で成り立つと定義するなら、その範囲内なら
OKです。

>例2)ニュートン法のテスト
>関数の根を求める方法としてニュートン法は有名です.しかし,ニュートン法は
>関数形によっては発散してしまいます.つまり,ニュートン法を使う際には,そ
>の事前条件として「入力の関数形が発散しないもの」が成立する必要があります.

入力の関数が発散するものの場合、どのような値を返すのでしょうか?
「ある回数以内にあらかじめ決められた誤差範囲内に収束しない場合、XXXを返す。」
と定義するのであればそのテストを書けばよいでしょう。
「その場合の動作は保障しない」
と定義するならテストはする必要はないでしょう。

>例3)複雑な幾何演算のテスト

例えば、円と線分の交点を求めるなら最低でも3つのケースをテストしないと
いけないでしょう。
でも乱数でやると円と線が接する場合のテストは、まず行われません。
テストケースは事前に人間が決めなければならないでしょう。

異常時の動作を定義するのは大変です。
また、動作を保証するのに必要十分なテストの代表値を決めるのも大変です。
それらはやはり人間がやらなければならないと思います。

----
渡辺 義則  no-ji@....jp