- 締切済み
PICマイコン MPLABアセンブラで小数点の累乗(べき乗)
- MPLABのアセンブラを使用して、PICマイコンで小数点の累乗を計算する方法を知りたいです。具体的には、n^-0.9067の計算方法や、四則計算だけで計算できるか、小数点を整数に変換して計算可能か、負の値を気にせずに計算できるかについて理解したいです。
- PICマイコンのMPLABアセンブラを使用して、n^-0.9067の計算方法について教えてください。また、計算には四則計算だけでできるのか、小数点を整数の変換して計算できるのか、負の値を気にせずに(正の数として)計算できるのかについても教えてください。
- MPLABのアセンブラを使用してPICマイコンで小数点の累乗(n^-0.9067)を計算する方法を教えてください。具体的な計算方法や四則計算のみで計算できるか、小数点を整数に変換して計算できるか、負の値を無視して計算できるかについても教えてください。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
べき乗がライブラリになければ、次の式を使い計算できます。 x^y = Exp(logn(x) * y) 見ての通り複雑で計算時間が長く誤差も大きい、やっかいな代表例。 これ大昔のパソコンでの MS-BASIC がルート計算に開平法のかわりに y=0.5 で使っており、手抜きだ、誤差はバグだ、と騒がれたことがありました。 今回は指数が定数であること。それに計算精度が甘くて良い、仮数の範囲が限られるという条件が許せるなら表引きするのが良いと思います。 そのままでは形がわるいので変形する n^-0.9067 = 1/n × n^0.0933 右端だけの値を確かめると、>1なら結構素直な変化。 0.01 0.651 0.1 0.807 1 1 10 1.24 100 1.53 表を作成して補間する。表の個数は精度と範囲次第。表数値も数式で導出するのが良いが、Exelで眺めて試すだけでも実用に耐えるものが見出せると思います。 >四則計算だけでできるのか OK >小数点を整数の変換して計算可能か ライブラリ任せ >負の値を気にせず(正の数)計算できるか 冒頭で判定を要しエラー処理
Cコンパイラではなくアセンブラなんですよね MPLAB C18だと 単精度のライブラリはあるので できると思いますが http://www.microfan.jp/mplab-c18 アセンブラレベルで 浮動小数はハードが対応していないと めんどくさいです http://ja.wikipedia.org/wiki/%E5%80%8D%E7%B2%BE%E5%BA%A6 倍精度 ↑ 桁合わせて計算し 最後に指数部の計算をする 基本的に足し算引き算で 掛け算割り算はできます ↑ 時間かかりますww 5x99 = 5+5+5+…(99階足したもの) 99/5 = 99 から 5が何回日引けるか 少数は 上記のように 指数表記して 123.456 = 123456e-3 0.123456 = 123456e-6 指数部を合わせて桁を合わせる 123456000 000123456 ----------- 123579456 指数部を計算する 123579456e-6=123.579456 Z80ですが(Z80はFPUを持っていないので参考になると思います) http://ldlabo.hishaku.com/NO24/hontai.htm わかりやすくしたもの http://kccn.konan-u.ac.jp/information/cs/cyber03/cy3_shc.htm 割り算 http://okwave.jp/qa/q5840424.html 掛け算に対しては0-F の 九九 をメモリ上に置き(16x16=256バイト) それで計算させると 早くなります インド式を使えばさらに高速化 上記の中ではたぶん最速のアルゴリズム
>四則計算だけでできるのか 連続関数は四則演算だけで出来ます。 ただし有限時間で出来るかは保証されていませんが べき乗関数はそれほど複雑ではありません。 求めるレンジと精度によって 真面目に浮動小数点算術演算ライブラリをインクルードして計算する。 計算しないで予め用意したテーブルを引く。 などの方法がありますが、 質問に記述された情報から見た感じでは 真面目に浮動小数点算術演算ライブラリをインクルードして計算かな。 http://www.picfun.com/mathlib01.html power関数はここみたい 0.5%精度 http://www.piclist.com/techref/microchip/math/power/16lr-ng.htm
> 一番知りたいのは四則計算だけで計算できるかです。 テーラー展開してみたらどうだろう。