たまりば

  パソコン・インターネット パソコン・インターネット  三鷹市 三鷹市

PICで平方根ルーチンができた気がする
2015年05月06日 23:32

なんとなく欲しくなったので作ってみたらできた気がする。
sqrt:
    movlw 0x60
    movwf diff
    movlw 0x40
    movwf subhnd
    bsf count,3
sqrtloop:
    movf subhnd,W
    subwf valh,W
    btfsc STATUS,C
    movwf valh
    movf diff,W
    rlf vall,F
    rlf valh,F
    rrf diff,F
    btfss vall,0
    xorwf subhnd,F
    btfsc vall,0
    addwf subhnd,F
    decfsz count,F
    goto sqrtloop
19命令、固定124サイクル。
valh:vallに平方根を求める値を入れる。vallに答えが出る。
このルーチンに入る前にcountはゼロにしておく。

入力は16bitを受け付けてくれるかと思いきや、大きすぎると計算途中でオーバーフローするようである。
15bitなら多分大丈夫。もうちょっと大きくても大丈夫な気がする。0b1011...まで大丈夫な気がしたがそんなことはなかった。

アルゴリズム

平方根の求め方 - 魔法使いの森
こちらのタイガー計算器での開平計算のアルゴリズムを参考にした。
同じことを2進法で行うのだが、2進法なので引く数を増やしながら順に引いていくところは1回だけで終わりである。

具体的には、
・平方根を求める数をAとする
・B=1
{
・Aの2nビット目からBを引き、キャリーを答にシフト (そのまま使えるのでPICのボローは楽である)
・引けたなら、B++; B<<1; B++
・引けなかったなら、B--; B<<1; B++
・A<<2
}繰り返し
なお図形的に考えたものに合わせAとB両方シフトするように書いたが、実際にはAを1bitシフト、Bを右に伸ばしていくようなコードになっている。これはタイガー計算器でもそうである。
コードに落としこむにあたって、引けた時と引けなかった時の計算に使う値を1つにまとめたのと、キャリーを壊さずに後の方まで使いまわしているのが楽しいところ。
引く数は最後の方は下位bitを切り捨てているので答えが多少ずれるだろうと思っていたのだが、いくつか試したところずれていないような気がする。不思議だ。
(5/7追記: √0が1になった。やっぱりなー。この程度は想定の範囲内。)

  • 同じカテゴリー(プログラム)の記事画像
    JPEG圧縮を繰り返しても際限なく劣化するわけではない
    ゲームボーイの吸い出し機を作った (後編)
    ファミコンで全画面に任意の画像(ただしモノクロ)を表示
    最近のWindowsのビットマップフォントの太字
    PCのキーボードのアーウが反応しなくなったあどうすえばよいか
    ARMマイコンはじめました。
    同じカテゴリー(プログラム)の記事
     JPEG圧縮を繰り返しても際限なく劣化するわけではない (2017-02-10 01:47)
     ゲームボーイの吸い出し機を作った (後編) (2017-01-16 22:44)
     ファミコンで全画面に任意の画像(ただしモノクロ)を表示 (2017-01-14 00:00)
     最近のWindowsのビットマップフォントの太字 (2017-01-09 18:49)
     浮動小数点数の10進指数表示のアルゴリズム (2016-12-28 01:28)
     PCのキーボードのアーウが反応しなくなったあどうすえばよいか (2016-07-17 04:34)
    URL欄を実験的に消してる間に廃止されてしまいました。まあいいか。
     
    <ご注意>
    書き込まれた内容は公開され、ブログの持ち主だけが削除できます。
    削除
    PICで平方根ルーチンができた気がする
      コメント(0)