#はじめに
組込エンジニアのソフト開発はテクニックが多いけど、Pythonやweb系プログラミングに比べると情報量が少ないので備忘録として紹介したいと思いました。
学生時代からプログラミングを勉強してきたけど、組込プログラミングを初めた頃は知らないテクニックが多くて驚きました。
#自己紹介
組込エンジニア歴15年くらい。
情報系大学院を卒業後、そのまま組込分野に携わっています。
#数値の扱い方
未だに整数演算しかできないマイコンも存在するし、過去リソーセスを利用するため、浮動小数点演算を禁止していることがあります。
ソース上では小数点演算も整数演算で表現しなければいけません。
そのため、物理値と内部値という考え方をします。
#物理値と内部値
現実世界の電圧(2.45[V])をどうやって、コンピュータ内で表現するか考えます。
物理値の条件
最大電圧:5[V]
最小電圧:0[v]
変化量 :0.01[V]ずつ変化させる
表現したい値:2.45[V]
この物理値をunsigned型、1バイトの変数で表現する方法を考えます。
内部値の条件
符号:なし(unsigned)
サイズ:1バイト(8ビット)
最大値:255
最小値:0
#物理値から内部値へ変換
内部値1で物理値がいくつになるか考えればいい。
これをLSBと呼んでいます。
LSBがいくつになるか考えていきます。
5[V] / 255 = 0.019607843137255[V]
内部値:1→物理値:0.019607843137255[V]
となるので、
物理値:2.45[V]は、内部値:124.95
しかし、整数値しか表現できないので
内部値:124
となります。
#検証
内部値:124が物理値:2.45[V]を表現できるか検証します。
124 * 0.019607843137255[V] = 2.43137254901961[V]
真値との誤差を検証する。
2.45[V] - 2.43137254901961[V] = 0.018627450980393[V]
物理値の変化量が0.01[V]なので電圧の変化を表現することができない。
なお、物理値:2.44[V]も内部値:124となってしまう。
#必要な精度にするために
1バイトで物理値を表現することはできない。そのため、2バイトで表現することで精度上げる。
#2バイトで内部値を表現した結果
内部値(2バイト)の条件
符号:なし(unsigned)
サイズ:2バイト(8ビット)
最大値:65535
最小値:0
LSBと2.45[V]を表現した結果を示します。
LSB:5/65535 = 7.62951094834821 * 10^-05
2.45[V]は内部値:32112
#再検証
内部値:32112が物理値:2.45[V]を表現できるか検証します。
32112 * 7.62951094834821 * 10^-05 = 2.44998855573358[V]
2.45[V] - 2.44998855573358[V] = 1.14442664225223 * 10^-05[V]
物理値の変化量が0.01[V]なので、電圧の変化を表現することができます。
#まとめ
小数点演算を整数演算で考えるためには、物理値から内部値に変換する必要があります。
その際、表現したい精度を考え、変数の型を決める必要があります。
#注意点
・今回決めた2バイト型とLSBは、ソースを触る人全員が知っている必要があります。
・全て一番大きな型で表現すれば、物理値の精度はある程度保証できると思います。
しかし、物理値の計算する場合、最大の型でしか持ってないと、演算がオーバーフローするので注意が必要です。