« 文鎮:ハンダ付け補助ツール 今回も「男の黒」で | トップページ | ARMマイコン、タイマーのインプット・キャプチャ機能で »

2017年6月13日 (火)

並列接続した抵抗

並列接続した抵抗値の計算式

   R = 1 / (1/R1 + 1/R2 + 1/R3)

抵抗値の逆数(コンダクタンス)を総加算して、
その値を逆数にすると並列抵抗値が出てきます。

で、この計算に関し、ちょいとプログラミング
絡みでの失敗体験を。

抵抗の並列接続のある回路で、抵抗値を変化さ
せた時、入出力がどんな挙動をするのかを調べ
るためにテストプログラムを書きました。
  (こんな単純な並列じゃなくって
   けっこう複雑なんですが、簡略化
   して説明)

しかし・・・結果が出ないポイントが発生。

R1~R3のうちのどれかがゼロになると「0割エラー」
が発生して処理が停止。
そりゃそうだ。

R1~R3のどれか一つでもゼロなら、並列抵抗値計算が
ゼロを返すような条件判断を追加して対処しました。

そのときの判断方法、「ゼロ判定、これで良い
のかな?」っと悩んだりしておりました。

・まずまっとうに、それぞれをゼロ判定してOR条件で
 R=ゼロに
  if((R1==0) || (R1==0))  R=0;
  else           R=並列計算処理();

・値が浮動小数点のとき「AND」で判定はまずい?
   if((R1 & R2) == 0)  R=0;

・乗算してゼロの判定でもOKか?
   if((R1 * R2) == 0)   R=0;

おそまつ。

|

« 文鎮:ハンダ付け補助ツール 今回も「男の黒」で | トップページ | ARMマイコン、タイマーのインプット・キャプチャ機能で »

電子回路工作」カテゴリの記事

コメント

むかーし、CADソフトウェアの開発をしてましたが、浮動小数点数の等号判定は御法度でしたね。
浮動小数点数の値は、計算を重ねる度に誤差を含んでいきますから。

ですので、あるdouble型の変数がゼロかどうかを判断する場合は、
その変数の絶対値がゼロと見なせる十分に小さな値かどうかで判定していました。

double a, b;
:
if(fabs(a) < XXX) {
:
} else {
:
}

投稿: 元CADソフト屋 | 2017年6月13日 (火) 23時17分

はい。
浮動小数点のゼロ判定(というか一致判定)、
C言語なら「FLT_EPSILONという値を見たら」
となっています。

全ビットゼロならゼロなんですが、人が指示した
きっちりした値じゃなく、計算途中の値を判定
するとなると、やはり、差の絶対値を判断する
ということをしなくちゃなりません。

たまたま仕事中のARMマイコンのfloat.hを見たら
4バイトの浮動小数点だと、
「1.19209290e-7 /* 0x1.0p-23 */」
という値になっていました。

投稿: 居酒屋ガレージ店主(JH3DBO) | 2017年6月14日 (水) 08時22分

ちゃんとした解説をメモっておきます。
※名前クリックでWikipediaへ

投稿: 居酒屋ガレージ店主(JH3DBO) | 2017年6月14日 (水) 08時49分

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/604464/65406800

この記事へのトラックバック一覧です: 並列接続した抵抗:

« 文鎮:ハンダ付け補助ツール 今回も「男の黒」で | トップページ | ARMマイコン、タイマーのインプット・キャプチャ機能で »