[HSP3] 複素数モジュール実装

既にあるとは思ってた。

複素数をモジュール変数を使って管理します。
いくつか数学関数も適当に組み込みました。

途中から気が亡失したのでサンプルプログラム以外の動作確認はしておりません。ちゃんと動いてるよね?
複素数使いたいなーと思ったら別の言語に切り替えたほうがいいですおFortranとか

扱いやすいように作ったつもりですが、マクロcpxget(cpx)辺りは分かりにくかったかな…
この辺りはHSPの仕様の限界と考えています。HSPは初心者向きの簡略化された言語として開発されたわけですから。

追記にソースコードがあります。


// -----------------------------------
// 複素数モジュール
// -----------------------------------
#module complex real,imag

#include "hspmath.as"

// initialize
#modinit double _real,double _imag
real = _real
imag = _imag
return

// ------------------------------------------

// セット
#modfunc cpxset double _real,double _imag
real = _real
imag = _imag
return

// polar
#modfunc cpxsetpolar double abst,double arg
real = abst*cos(arg)
imag = abst*sin(arg)
return

// 実数取得
#modcfunc cpxgetreal
return real

// 虚数取得
#modcfunc cpxgetimag
return imag

// ------------------------------------------

// arg
#modcfunc cpxarg
if (real==0 && imag==0) : return 0.0
return atan(imag,real)

// abs
#modcfunc cpxabs
return sqrt(imag*imag+real*real)

// ------------------------------------------
// ここの演算は A = A op B

// 足し算
#modfunc cpxadd double _real,double _imag
real += _real
imag += _imag
return

// 掛け算
#modfunc cpxmul double _real,double _imag
tmpr = real*_real - imag *_imag
imag = imag *_real + real*_imag
real = tmpr
return

// 割り算
#modfunc cpxdev double _real,double _imag
tmp = real*real + imag*imag
tmpr = (real*_real + imag *_imag)/tmp
imag = (imag *_real - real*_imag)/tmp
real = tmpr
return

// ------------------------------------------
// ここの演算は A = op(A)

// 複素共役
#modfunc cpxconj
imag = -imag
return

// sin
#modfunc cpxsin
tmpr = sin(real)*cosh(imag)
imag = cos(real)*sinh(imag)
real = tmpr
return

// sinh
#modfunc cpxsinh
tmpr = sinh(real)*cos(imag)
imag = cosh(real)*sin(imag)
real = tmpr
return

// cos
#modfunc cpxcos
tmpr = cos(real)*cosh(imag)
imag = sin(real)*sinh(imag)
real = tmpr
return

// cosh
#modfunc cpxcosh
tmpr = cosh(real)*cos(imag)
imag = sinh(real)*sin(imag)
real = tmpr
return

// exp
#modfunc cpxexp
tmp = expf(real)
tmpr = tmp*cos(imag)
imag = tmp*sin(imag)
real = tmpr
return

// sqrt
#modfunc cpxsqrt
tmpr = sqrt(cpxabs(thismod))
tmpi = cpxarg(a)/2
real = tmpr*cos(tmpi)
imag = tmpr*sin(tmpi)
return

// log
#modfunc cpxlog
tmpr = logf(cpxabs(thismod))
imag = cpxarg(thismod)
real = tmpr
return

// pow
#modfunc cpxpow double _real,double _imag
if (imag == 0 && real == 0){
if (d==0) {
real = 1.0 : imag = 0.0
return
}else{
real = 0.0 : imag = 0.0
return
}
}
tmp = cpxabs(thismod)
tmpi = cpxarg(thismod)
tmpr = powf(tmp,_real)*expf(-_imag*tmpi)
tmpi = _imag*logf(tmp)+_real*tmpi
real = tmpr*cos(tmpi)
imag = tmpr*sin(tmpi)
return


#global

// マクロ
// 簡略化マクロ
#define ctype cpxget(%1) cpxgetreal(%1),cpxgetimag(%1)
#define ctype cpxgetm(%1) -cpxgetreal(%1),-cpxgetimag(%1)
// 引き算
#define cpxsub(%1,%2,%3) cpxadd %1,-(%2),-(%3)


#if 1
newmod c1,complex,1,1
newmod c2,complex,2,3
newmod cr,complex,0,0

cpxset cr,cpxget(c1)
cpxadd cr,cpxget(c2)

mes strf("(%5.2f+%5.2fi) + (%5.2f+%5.2fi) = %5.2f+%5.2fi",cpxget(c1),cpxget(c2),cpxget(cr))

cpxsetpolar c1,1,M_PI/4*3
cpxsetpolar c2,1,M_PI/4

cpxset cr,cpxget(c1)
cpxmul cr,cpxget(c2)

mes strf("(%5.2f+%5.2fi) * (%5.2f+%5.2fi) = %5.2f+%5.2fi",cpxget(c1),cpxget(c2),cpxget(cr))

cpxset cr,0.0,-M_PI
cpxexp cr
mes strf("euler = %5.2f+%5.2fi",cpxget(cr))


stop
#endif
スポンサーサイト

テーマ : プログラミング
ジャンル : コンピュータ

tag : HSP3

コメントの投稿

非公開コメント

プロフィール

舞葉(ぶよう)

Author:舞葉(ぶよう)
github.io
はてなブログ(競プロ)

古い記事のソースコードは色分けしていないので、高機能テキストエディタに貼り付けたほうが見やすいかも。

検索フォーム
このブログについて
自分がつまづいた話題、なんとなく書きたいと思ったこと、ググったけど殆ど資料なかったぞオイ な話等をアップする予定。通りすがりでも、参考になっていただければと。プログラムの例外入力、メモリリークは責任負いません。投稿された記事は修正・削除する場合があります。
カテゴリ
タグ

HSP3アルゴリズムとデータ構造c++RubyJavaUnity画像解析C機械学習C#LinuxcodeIQKinectMinecraftTonyuSystemraspberrypiPythonHTML5音声制御Simulinkruby俺ルール通信制御Javascriptシミュレーション

counter-shinobi
固定記事
最新記事
最新コメント
月別アーカイブ
ブロとも申請フォーム

この人とブロともになる

アクセスランキング
[ジャンルランキング]
コンピュータ
1467位
アクセスランキングを見る>>

[サブジャンルランキング]
プログラミング
265位
アクセスランキングを見る>>