div10(), div100(), div1000()
センサー値などで100倍した値をuint16_t
型にして受け渡しする場合がありますが、除算回路がないマイコンでの計算処理には相応の時間がかかるため、加算・減算・乗算とビットシフトを用いた近似計算と補正により計算を行います。
val
に計算したい値、rem
は余りの格納変数、neg
は符号を格納する変数を渡します。
戻り値は商の値(常に正)、rem
には余りの値(常に正)、neg
は負ならtrue
が格納されます。
計算アルゴリズムの制約(桁あふれ)からdiv100()
とdiv1000()
での計算可能な値域が決まっています。div100()
は-99999~99999までの値に対応し、div1000()
は-999999~999999までの値に対応します。
商を得る近似計算式
使用例
計算速度
10分の1程度になります。
結果の出力
割り算の結果を格納するdiv_result_i32
クラスにはformat()
メソッドを用い_div_chars
クラスオブジェクトを得ることが出来る。_div_chars()
クラスオブジェクトは文字列バッファを内包していてconst char*
型として文字列バッファにアクセスするメソッドが用意されている。また、Serial
オブジェクトに対する<<
演算子も実装している。
format()
メソッドのパラメータの1番目dig_quo
は出力桁数(符号部を含まず)を指定します。出力桁数に足りない場合(以下、不足桁)は空白または0
で埋めます。2番目のパラメータopt
は書式を指定します。
optパラメータ | 内容 |
---|---|
DIVFMT::STD | 標準的な出力で、不足桁は空白で埋め、負の値に限り- を付加します。 |
DIVFMT::PAD_ZERO | 不足桁は0 で埋めます。 |
DIVFMT::SIGN_PLUS | 正の値にも+ 符号を付加します。 |
DIVFMT::PAD_ZERO_SIGN_PLUS | 不足桁は0 で埋め、正の値にも+ 符号を付加します。 |
DIVFMT::SIGN_SPACE | 正の値の場合は+ 符号の替わりに空白を付加します。 |
DIVFMT::PAD_ZERO_SIGN_SPACE | 不足桁は0 で埋め、正の値の場合は+ 符号の替わりに空白を付加します。 |
例
背景
TWELITE BLUE/RED では除算はコストが高い演算であるため、目的を限定した除算アルゴリズムを追加した。
ライブラリ内では温度・湿度といった一部のセンサー値、100倍の値(25.12℃なら2512)を用いて表現しているため、100で割った商と余りを得るための簡素な手続きを定義した。
dev_result_i32::format()
については、書式出力を行う際の煩雑さを避けるためである。