Common Lispの系譜を継ぐマイコン上のuLispをラズパイPico2上で練習中。前回は算術演算を練習するのに浮動小数点数使ってしまいました。しかし、uLispにおいては浮動小数点数は extensions という位置づけです。ターゲットマイコンによっては使えない機種もあり。Common Lispとの差異もあり。
※Lispと一緒 投稿順 index はこちら
※実機確認は Raspberry Pi Pico2で行ってます。
※使用させていただいとります uLisp のバージョンは 4.6b (Arm用)です。
※uLispとCommon Lispとの動作比較のために使わせていただいている処理系は以下です。
SBCL 2.2.2 (SBCL = Steel Bank Common Lisp )
πはどこへ行った?
Common Lisp上であれば、PIというお名前の定数あり。それを呼び出せば円周率が返ってまいります。しかし、浮動小数の存在すらオプショナルな uLisp(ターゲットマシンのPico2の場合、Arm Cortex-M33を頭に頂いているので浮動小数の計算に問題ありません)では、どうも「ありがちな」数学定数などは定義されていないようです?老人は見つけることができませなんだ。
そこで、アークタンジェントを呼び出してパイ(もどき)を計算していただくと上記のようです。これを使って pi を変数定義したものが以下に。
これで、piという「変数」が出来ました。これにCONSセル4個も使ってしまったけれども。
平方根
今回は三角関数メインで練習してみるつもりですが、ラジアン扱うときには平方根が頻出するので確認しておきます。
上記をみると後ろの方に f とあるので、単精度浮動小数で返ってくるようです。まあ、Common Lispでもこの辺の扱いは一律でないようなので、たまたま手元の環境ではということであります。
これも単精度の値だと思いますが、uLispでは小数点以下5桁表示がデフォルトみたいっす。
SINとCOS
MaximaからLispしているための問題発覚
ここでまさかの問題発覚、Common Lispに tan計算してもらおうとしたらこんなエラーに遭遇。
え~、タンジェントが無いわけないじゃん! その理由はCommon Lispを呼び出している環境にありでした。Lisp処理系を直接呼び出しているわけでなく、Maxima処理系の下に隠れている SBCL を使役しているので、間にMaxima様の「層」があるのです。ここでMaxima様の注意を発見。
どういう大人の事情か、Lispの関数が「隠されている」ものがあるみたい。あれよ、練習しようとした tan とか、逆三角関数どもは、そうだと。しかたねえずら。
(asin 1)の結果は (/ pi 2)と一致しているので π/2 であることが分かります。
なお、Common Lispでなく、Maxima様上での tan、asin、acosの結果、ご参考まで。
意図しなければ、浮動小数ではなく、πを使った数学的表記で結果が返ってまいります。流石だ。