PICマイコン MPLABアセンブラで小数点の累乗(べき乗)

このQ&Aのポイント
  • MPLABのアセンブラを使用して、PICマイコンで小数点の累乗を計算する方法を知りたいです。具体的には、n^-0.9067の計算方法や、四則計算だけで計算できるか、小数点を整数に変換して計算可能か、負の値を気にせずに計算できるかについて理解したいです。
  • PICマイコンのMPLABアセンブラを使用して、n^-0.9067の計算方法について教えてください。また、計算には四則計算だけでできるのか、小数点を整数の変換して計算できるのか、負の値を気にせずに(正の数として)計算できるのかについても教えてください。
  • MPLABのアセンブラを使用してPICマイコンで小数点の累乗(n^-0.9067)を計算する方法を教えてください。具体的な計算方法や四則計算のみで計算できるか、小数点を整数に変換して計算できるか、負の値を無視して計算できるかについても教えてください。
回答を見る
  • 締切済み

PICマイコン MPLABアセンブラで小数点の累…

PICマイコン MPLABアセンブラで小数点の累乗(べき乗) n^-0.9067の計算をMPLABのアセンブラでやりたいのですが 記述、計算方法がわかりません。 わからない点 ・四則計算だけでできるのか ・小数点を整数の変換して計算可能か ・負の値を気にせず(正の数)計算できるか 一番知りたいのは四則計算だけで計算できるかです。 これができるとある程度正確な結果が得られるので ご教授よろしくお願い致します。

noname#230358
noname#230358

みんなの回答

noname#230359
noname#230359
回答No.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 >小数点を整数の変換して計算可能か   ライブラリ任せ >負の値を気にせず(正の数)計算できるか   冒頭で判定を要しエラー処理

noname#230359
noname#230359
回答No.3

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バイト) それで計算させると 早くなります インド式を使えばさらに高速化 上記の中ではたぶん最速のアルゴリズム

noname#230359
noname#230359
回答No.2

>四則計算だけでできるのか  連続関数は四則演算だけで出来ます。  ただし有限時間で出来るかは保証されていませんが  べき乗関数はそれほど複雑ではありません。 求めるレンジと精度によって  真面目に浮動小数点算術演算ライブラリをインクルードして計算する。  計算しないで予め用意したテーブルを引く。 などの方法がありますが、 質問に記述された情報から見た感じでは  真面目に浮動小数点算術演算ライブラリをインクルードして計算かな。  http://www.picfun.com/mathlib01.html   power関数はここみたい 0.5%精度 http://www.piclist.com/techref/microchip/math/power/16lr-ng.htm  

noname#230359
noname#230359
回答No.1

> 一番知りたいのは四則計算だけで計算できるかです。 テーラー展開してみたらどうだろう。

関連するQ&A

  • PICマイコンのアセンブラについて

    PICマイコンのアセンブラルーチンについて PICマイコンのアセンブラについて教えていただきたく投稿しました。 http://orange.zero.jp/electronics/pic/pic.html 上記のサイトについてです。 『●「整数演算」』の 『◇8×8=16ビットの乗算』についてです。 つまり、下記リンクの演算ルーチンについて、大まかな流れだけでいいので解説していただけないでしょうか。 http://orange.zero.jp/electronics/pic/mul816.txt よろしくお願い致します。

  • PICで小数点の演算

    PIC16F877Aを使ってプログラムを作っています。その内容がセンサー(例えば温度センサー等)から取り入れた電圧をPICのA/D変換(10bit)を行って、その値を使ってpicで計算し、その結果を液晶に表示するといった内容なのですが、その計算過程で小数を扱わなければならないのですが、その計算がうまくいきません。A/D変換後の値をxとし具体的に式で書くと、 v = x * 5 / 1023  ・・・(1) ここでvはセンサーから取り込んだ電圧値(値の範囲は0.935~1.748)です。 y = 218.5 - v / 0.008  ・・・(2) 又は y = 218.5 - 125 * v  ・・・(3) 上記の式はA/D変換後の値xを一度アナログ電圧値vに変換し(1)、そこから(2)又は(3)へ代入して得たい情報yを算出するといった少々面倒なものなのですが、これをアセンブラで書きたいのですが、このPICには乗除命令がないことや小数点の演算方法、16bitの乗除等の部分が引っかかってどうもうまくかけません。小数部分は固定小数点形式で考えて最終的にyは少数第二位を四捨五入したいと思っています。 どのようにプログラムを作ればよいのでしょうか。実際にソースを書いていただけると大変理解しやすいです。

  • MPLAB IDE v8.92アセンブラについて

    PICマイコンを初めて使う初心者です。 準備としてPickit3を購入し、最新バージョンの”MPLAB IDE v8.92”を開発環境に入手しましたが、 初期設定の”Project Wizard”でアセンブラのコンパイラーの選択が上手くいきません。 ”mpasmwin.exe”などのコンパイラーが入手できたら可能なのか、そもそもアセンブラでは開発は出来ないものなのでしょうか? また、コンパイラーの実行ファイルの入手ができたとしてリンクさせる方法などご存知の方がおられましたら、ご教示お願い致します。 マイクロチップへ問い合わせをしているのですがなかなか回答がきません。 よろしくお願い致します。

  • PICマイコンのアセンブラルーチンについて

    PICマイコンのアセンブラについて教えていただきたく投稿しました。 http://orange.zero.jp/electronics/pic/pic.html 上記のサイトについてです。 『●「整数演算」』の 『◇16÷16=16ビットの割り算(余りも得られる)』の下にある 『◇上と同じ。基本命令のみに変更したもの。』についてです。 つまり下記リンクの演算ルーチンについて、大まかな流れだけでいいので解説していただけないでしょうか。 http://orange.zero.jp/electronics/pic/div16_2.txt よろしくお願い致します。

  • PICマイコンPIC12F509について

    これからPICを勉強しようとしているPIC未経験者です。 とりあえず使用するPICはPIC12F509を考えています。ネットの情報量からすると本当はPIC12F683の方が良いのかも知れませんが価格面からPIC12F509を検討しています。 PICはこれから購入しますが一番最初に触るPICマイコンとしてPIC12F509を選択しても大丈夫でしょうか? 一応言語はアセンブラを勉強しようと考えています。また、最初の目標として入力1に5Vがかかった時に出力1から何ミリ秒か遅れて5Vが出力され、入力1の加わる5Vが不定期に素早くON-OFFを繰り返えしてもPICの電源をOFFするまでずっと繰り返し動作する程度の物を組みたいと思っています。 現在の開発環境はPCにMPLAB X IDE v3.26等のソフトをインストール、PICkit3を入手程度です。 先日、MPLAB IPE v3.26を使用しHEXファイルをPIC18F2550に書込みを初めてしてみました。これが初めてのPICとのふれあいです。 以上、PIC知識人の皆さまご教示を宜しくお願い申し上げます。

  • 小数点以下を消す計算

    「ある数の小数点以下の値を消して、整数にする」という計算式を作るのは可能でしょうか? その際、以下の条件があります。 ・「ある数」には整数も含まれるものとします。 ・計算には四則しか使えません(√などは駄目)。 ご面倒でも、回答をお願いします。 EXCELではありません。

  • MPLAB Ver8.10の使い方を教えてください。

    PIC初心者です。 技術者向けカテですが、どこに書いてよいのか分からないのでここに質問させてください。 今までPA.EXEというアセンブラを使ってPICマイコンのプログラムをアセンブルしていたんですが、一度MPLABを使ってみようと思いDLしました。 しかし、DLしたものを起動させてみたものの何をどうしたらよいのかさっぱり分かりません(全て英語ですし・・・)。 何をどうしたらプログラムしたASMファイルをHEXファイルにアセンブルできるのでしょうか? MPLABを起動してからアセンブル完了までの流れを出来る限り詳しくわかりやすく教えてください(出来れば専門用語も分かりやすい言葉でお願いします)。

  • 小数点のずらしかた

    バカな質問ですが、小数点のずらしかたが分かりません。 例えば、4÷1.6=2.5=小数なのに、28÷0.5=56整数になります。 どうして答えが小数点になったり、整数になったりするのでしょうか。 計算する時、どうやって小数点をずらせばいいのでしょうか。

  • 【PICマイコン】一般製品にPICシリーズが使われてるって本当ですか?

    最近PICをはじめて大分アセンブラもなれてきて楽しめるようになってきました。 それで教えてGOOで色々見てるときにPICシリーズのマイコンは一般製品の中にも組み込まれているって書いてあったんですが本当ですか? 僕の中でPICやAVR等はそれなりにコアな趣味を持つ人たちのおもちゃ的な物だと思ってました。 もし本当に入ってるんだったら具体的にどんな製品にどのマイコン(例PIC16F877A等)が使われてるのか教えてください。凄く興味があります。 また、何処のサイトだったか忘れましたが「これからマイコンをはじめるならAVR!PICをやるメリットなし!」ぐらいの勢いで書いてあったんですがその通りなんでしょうか? もひとつ、、PICの勉強をはじめるときにアセンブラかCかで迷ったんですがアセンブラではじめた方がCPUの構造をより理解しやすいとの事でアセンブラで進めてきたんですが、いまいちその実感がわきません。具体的にどういう所でCPUの構造を理解しやすいのでしょうか? それっぽいなぁと思うのはクロックでタイミングを与え、そのタイミング毎に命令を実行しレジスタのBITで条件判断をしたり計算をしたりしてポートに出力する的な部分でしょうか?そもそもCPUの構造ってどういう事なんでしょうか?何て言うか例えて言うならエクセルは仕事で使うから詳しいけどWindowsの設定は全然解りませんみたいな感じです。 よろしくお願いしますm(_)m

  • PICマイコンにつきまして教えてください。

    PICマイコンにつきましておしえてください。 初心者です、以下3点につきまして教えてください。 (1) PICマイコンを用いて、実験機を作成しているのですが、プログラム上の ある関数の処理時間がどのくらいが予測したいと思っています。 アセンブラの場合、クロック周期の4倍が1サイクルで、各処理毎に○サイクル というのが、データシート上に記載されていることから、ざっくり処理時間を 予測することができるのですが、C言語の場合、予測することはできないでしょうか? 加算、減算、ポート出力制御、if文、AD、、、等の1命令毎の処理時間がどのくらいか、 予測することができますでしょうか? (2) 実験機にはLCDをmain関数で表示させており、またTimer割り込み(5μsec)毎に簡単 な処理をおこなわせているのですが、動作させてみると、 LCDが表示せず(文字なしで高速で切り替えを繰り返しているような感じです。) これは、割り込み間隔が早すぎて、main関数に入る前に随時5μsec割り込みが入って main関数の表示ができていないということなのでしょうか? 割り込み間隔を50μsecにしたところ、うまく表示されましたので。。 (そういったことから(1)の質問をしました。) (3) MPLAB IDC2はデバッグシミュレータがあり、予測が難しい場合、ストップウォッチで、 確認しようと思っています。ブレークポイントを処理最初と最後に設定して、RUNで 時間を確認することができますでしょうか? 処理最初のブレークポイントまでは、どのように実行位置をもっていくのでしょうか? 長くなりましたが、よろしくお願いいたします。