div100()
10、100または1000で割った商と余りを計算します。
struct div_result_i32 {
int32_t quo; // quotient
int16_t rem; // remainder
uint8_t b_neg; // true if negative
uint8_t digits_rem; // digits of remainder
};
div_result_i32 div10(int32_t val);
div_result_i32 div100(int32_t val);
div_result_i32 div1000(int32_t val);
センサー値などで100倍した値をuint16_t型にして受け渡しする場合がありますが、除算回路がないマイコンでの計算処理には相応の時間がかかるため、加算・減算・乗算とビットシフトを用いた近似計算と補正により計算を行います。
valに計算したい値、remは余りの格納変数、negは符号を格納する変数を渡します。
戻り値は商の値(常に正)、remには余りの値(常に正)、negは負ならtrueが格納されます。
計算アルゴリズムの制約(桁あふれ)からdiv100()とdiv1000()での計算可能な値域が決まっています。div100()は-99999~99999までの値に対応し、div1000()は-999999~999999までの値に対応します。
使用例
計算速度
10倍程度になります。
結果の出力
割り算の結果を格納する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 無線マイコンでは除算はコストが高い演算であるため、目的を限定した除算アルゴリズムを追加した。
ライブラリ内では温度・湿度といった一部のセンサー値、100倍の値(25.12℃なら2512)を用いて表現しているため、100で割った商と余りを得るための簡素な手続きを定義した。
dev_result_i32::format()については、書式出力を行う際の煩雑さを避けるためである。
最終更新