2018/7/4(WED) | 【後方排気】SI:割り算で小数点 |
---|---|
さて
ずっとYPVSインジケーター作りをしていたので 久々にシフトインジケータである。 どこまでやったのかも忘れかけていますが・・・ 「エンジン回転数÷スピード」にて 今、何速で走っているかを表示しようとする で、小数点の計算が必要ということで 仕事中にいろいろ考えてみた <ナイショだよ 70 ÷ 30 で考えてみる 小数点を考えなければ ↓こんな感じ ![]() 商が2で余りが10 で、商の小数点第一位を求めるとしたら 余りを10倍して、除数で割れば求まる ![]() 10を10倍して 除数30で割ると ![]() 商は3と。 つまり商の少数第一位は3ということ よって、少数第一位まで求めると商は2.3ということになります。 ただ、ここで問題 8ビットで表現できるのは255まで。 今回、除数30とした場合 最大の余りは29となるわけで それを10倍すると290となり 255を超える つまり8ビットで計算できなくなるわけです。 なぜ8ビットじゃないといけないかというと 8ビットマイコンなんで、レジスタのサイズが8ビットなのだ。 まぁいろいろすれば8ビット以上の数値の計算もできるんですが・・・ 面倒なので、8ビット内で計算したい。 ということで考えたのが 5倍して割り算して2倍する。 まぁ当然、誤差が出てきますが それほど精度を求めていないので 大丈夫でしょう。 つまり先ほどの例でいけば 余り10を5倍します ![]() 除数30で割ります ![]() 商を2倍します。 つまり左に1ビットシフトします。 ![]() で、求まる解は2なので 商は2.2ということになります。 先ほどの2.3に比べると0.1の誤差が出ていますが まぁこれくらいキャパでしょう <本当か??? さらに結果をBCD的な表現に変換します。 BCDってのは二進化十進表現のことね えっと・・・Binary-coded decimalの略かな? 4ビット毎で数字0〜9を表現する方法です。 これをちょっと応用して 上位4ビットは整数部で 下位4ビットは少数部を表現することとすると 整数の商を4ビットシフトして 少数の商を足すとこんな感じになります。 ![]() というのを アセンブラでテストプロを実装すると 以下の通り ![]() 割り算ルーチンは以前作ったのをコールします。 8行目と26行目で割り算ルーチンをコールしています。 15行目辺りは、一回目の割り算の余りを5倍しています 2回シフトして元の余りを足すことで5倍しています う〜む。掛け算もメンドイ。 29行目は左シフトで2倍していることになっています。 てか、2回も割り算ルーチンをコールして大丈夫かな? 処理時間が結構かかります・・・計算してないけど・・・ で、実際に動くかシミュレーターで動かしてみると ![]() 計算結果が出たところでブレークしてみると 商は矢印のところね 「00100010」となっているので 4ビット毎にみると22となっています つまり「2.2」ということで間違いないようです。 さて、バラバラにテストしてきたから ボチボチまとめに掛からないと・・・ 回路もボチボチと・・・ はたして完成することはあるのだろうか? |