『Cプログラミング診断室』目次次(第4章 キャストが好き 構造体)

第4章 キャストが好き

計算誤差


CADのような、科学技術系のソフトウェアでは、浮動小数点計算や、整数化による誤差が常に 問題になります。

134行からの関数convert1は、3次元空間上の多数の点の座標変換(回転)を行なっています。 たぶん、多数の座標値は、多角形の周囲を示し、その内部をハッチングするのが、本プログラムの 最終目的でしょう。座標、x,y,z別々にlong型の配列に保持されています。convert1の下請け関数 として、convert_sub1とconvert_sub2があります(完全に無意味な名前の付け方ですね)。

関数convert_sub1は、回転角度のsin,cosを求め、convert_sub2は、回転角度のsin,cosから多数 の座標値を実際に回転します。

元の関数convert1は、3つの部分から成り立っています。

(a) 139〜151行 z軸周りの回転
(b) 153〜165行 y軸周りの回転
(c) 167〜179行 x軸周りの回転
それぞれは、極めて良く似ているので、ちょっと工夫すれば関数にでき、その関数を引数を3回 変えて呼べば済むようにもできるでしょう。でも、もっと根本的問題を抱えています。

座標値がlong型であるので、関数convert_sub2の回転計算でいくら精度を上げても、回転後の座 標値が整数化されてしまうため、相当の誤差が考えられます。各座標値は、(a),(b),(c)の各回で 回転による座標変換が行なわれます。したがって、整数化による誤差が3度も発生しています。し だいに形が崩れてきそうで恐いですね。

大学1年(理工系)や、専門学校で線形代数をちゃんと勉強していれば、もっとちゃんとしたや り方が分かりますよね。各座標に3回座標変換を施すのではなく、3つの座標変換の積を求めて、 それで全座標値を1度だけ座標変換すれば済みますね。計算も早くなるし、整数化の誤差も1度し か発生しないので、良いことずくめですね。

修正プログラム(リスト4−3)では、行列、ベクトルに対する基本的な関数をちゃんと用意し、 それらの組み合わせで処理するようにしました。

CAD、グラフィックスのようなプログラムでは、3次元座標変換などの一連の関数群をきちん と用意し、ちゃんとライブラリにして、全員で使うようにすることが不可欠です。個々の開発担当 者が別々に作ったりすると、開発効率や信頼性が著しく低下してしまいます。リスト4−3に追加 した関数は、ほんの一例に過ぎません。

O'Reilly Japan刊

3/14発売
増刷:第3刷決定♪

オープンソース
Scheme言語処理系
Gaucheの愛好者団体

詳細はブログで



Copyright1996 Hirofumi Fujiwara. No reproduction or republication without written permission
『Cプログラミング診断室』目次次(第4章 キャストが好き 構造体)