本日のお題は『トレランス(公差)』です。
CADというソフトは非常に小さな値を扱うことができ、その小さな値で作られた物体を画面上に再現することができます。
ただ時として、その小さな値がプログラム計算に大きな影響を与えることがあります。
今回はその点に着目していきたいと思います。
1. 環境
今回は下記の環境を使っています。
- Python 3.6.1
- PyScripter 3.6.1 (x86)
2. doubleの等価判定の危険性
プログラムを少し習った方であれば、double,floatといった小数点を扱える値の等価判定は危険という言葉を聞いたことがあるかもしれません。
def doubleTest(value1, value2): if(value1 == value2): print ("value1とvalue2は同じ値のようです。") else: print ("value1はvalue2は違う値のようです。") def main(): doubleTest(10.0, 10.0) if __name__ == '__main__': main()
value1とvalue2は同じ値のようです。
理由としては、計算をしている間に桁落ち・情報落ちなどの事象により、再現しきれない桁の値が意図しないものになる可能性があるからです。
意図しないもの同士の判定を行うと、場合によっては、真になるはずの場所が偽になったりします。
(上の例では、偶然うまく同じ値と判定されたと考えるべきです。)
実はCADではこういうことが割と起こります。そこで登場するのが、トレランス(公差)です。
3. トレランスとは?
トレランスというのは、簡単に言えば『許容誤差』です。
設計に携わっている方は結構目にするかもしれませんが、図面に『50±0.05』とか書いてあることがあります。
これは加工する際に、49.5mm〜50.5mmまでなら出来上がり上、問題がないことを指しており、寸法公差といいます。
話が少しそれましたが、プログラムでもこの概念を使います。
4. 実際にはどうやる?
そんなに難しいことではありません。先ほどのプログラムを少し改良してみましょう。
def doubleTest(value1, value2): tolerance = 0.001 if(abs(value1 - value2) <= tolerance): print ("value1とvalue2は同じ値のようです。") else: print ("value1はvalue2は違う値のようです。") def main(): doubleTest(10.0, 10.0) if __name__ == '__main__': main()
value1はvalue2は同じ値のようです。
プログラム内の等価判定に任せず、許容誤差値(tolerance)を定義して、値1と値2の引き算がこの許容誤差の中に含まれているか判定します。
実際にどの桁数まで判定するのが良いのかについては、依頼元の要望次第になります。
開発の依頼を受けた際は、十分に注意しましょう。
5. まとめ
- double値の等価にはトレランスを用いること
- トレランスの大きさは依頼元としっかり詰めること
- CADのトレランス設定を必ず確認しておくこと
6. 最後に
小数点だらけのCADでは、トレランスは切っても切れない関係にあります。
座標やベクトルといった計算をする時は、必ず頭の片隅に入れておきましょう。
更なる情報をお探しの方は!
下記のリンクから、FreeCADプログラミングのトップページに飛びます。
よろしければご参照くださいませ。