多倍長計算
Juliaで多倍長の小数演算.
そう!BigFloat
!
a = BigFloat(0.1)
って書いてたけど, こうではなく
a = big"0.1"
って書かねばならんらしい.
BigFloat()
っていう関数に渡す前の数字がFloat64
で先に読み込まれてしまい, ずれた値が返ってきてしまう.
ただ, big""
っていう表記には数字にしか使えないっぽく,
b = big"sqrt(2)"
というのは許されない.
c = big"2" b = sqrt(b)
とか
b = sqrt(big"2")
と書けばよい.
(追記)Float64をBigFloat関数に突っ込むのと同じだ…
big"0.1"+sqrt(big"2") = 1.514213562373095048801688724209698078569671875376948073176679737990732478462105 0.1+sqrt(big"2") = 1.514213562373095054352803847335480780687830215831049635676679737990732478462102 (参考)sqrt(2) = 1.4142135623730950488016887242096980785696718753769480731766797379907324…
意外と面倒そう…
align再発見
\begin{align} \begin{array}{ll} \begin{array}{rll} a & = & 1\\ a & = & 2 \end{array} & \begin{array}{l} (i=1,\, 2,\, \ldots,\, 10)\\ (i=11,\, 12,\, \ldots) \end{array} \end{array} \end{align}
って感じで数式書いてて,
おっ, ちゃんと揃えられるじゃんarray優秀~って思ったら, 数式番号は全体に一つしかつかない…
\begin{align} a&=1 & &(i=1,\, 2,\, \ldots,\, 10)\\ a&=2 & &(i=11,\, 12,\, \ldots) \end{align}
なんだ. alignの中に&
をたくさん(?)ぶち込めば揃えられるじゃん.
ただ, 気になるのは真ん中の空間が長すぎること. \hspace
で詰めたら数式番号まで寄ってきてしまってそれは違うなと…
真ん中の長さはarray
の方が良いし, 数式番号とイコールの両脇の隙間をみるとalign
の方がいいし,
いいとこどり出来ないものか…
配列の初期化(任意精度浮動小数点演算)
新年明けましておめでとうございます.
年越し研究室は避けたものの, 無事プログラミングをしながら年を越したみやびでございます.
配列の初期化は
a = zeros(2) b = zeros(3, 2)
ってするのだが, ここにいくら
a[1] = BigFloat(1.0) b[2, 1] = BigFloat(sqrt(2))
とかやっても所謂普通のdouble型にしかならないようだ.
最初にメモリ確保しちゃうからとかなのかな. 多分.
多倍長にしたいなら
a = zeros(BigFloat, 2) b = zeros(BigFloat, 3, 2)
とする.
配列の扱い
JULIA言語では基本的に変数の宣言, 初期化は必要ない.
a = 1 #int型 b = 1.0 #double型
と, 勝手に認識してくれるし,
c = a+b #1.1
と, 自然な形で計算してくれる. あ, #~
は1行のコメントアウトね.
ちなみに複数行の場合は#= ~~~ =#
で囲む.
話を戻そう.
配列は番号が0からではなく1から始まり, 1次元配列は
x = [1, 2, 3] #x[1] = 1, x[2] = 2, x[3] = 3
2次元配列は
y = [1 2;3 4] #y[1, 1] = 1, y[1, 2] = 2, y[2, 1] = 3, y[2, 2] = 4
のように使うのだが, いきなり
y[1, 1] = 1
のように代入することは出来ないようだ.
代入する値が煩雑な式の場合は, 一旦初期化してからそれぞれの要素に代入するのがよさそう. つまり,
x = zeros(3) x[1] = 1 y = zeros(2, 2) y[2, 1] = 3
といった具合. zeros()
で配列の要素全てに0を代入している.
関数の定義
function
だけ. 単純!
function hoge(x) return x + 1 end x = 1 y = hoge(x) println(y)
Cでいうところのdouble型(int型?)関数ですね. return
は省略可能.
しかしvoid型の使い方が分からん!困った!
さっきから分からないことだらけじゃないか!
まあつまり,
function hoge(x, y) y = x + 1 end x = 1 hoge(x, y) println(y)
ってやるとyが定義されてないよ!って怒られ,
function hoge(x, y) y = x + 1 end x = 1 y = 1 hoge(x, y) println(y)
ってやると1が返ってきたので関数に入ってないな…
うん, これもできないとやりたいプログラムが書けないぞ.
(追記) C言語で同じプログラム書いたら出来なかったぞ…()
出直してきます…
まあ今ここを考えている暇はないので保留で!(笑)
解決したら更新しよう. 当面関数使わずに直接ぶち込むか.
for文, while文
基本的な構文 第2回 for文, while文
みんな大好きループの代表格, forとwhileについて.
for i in 1:10 println(i) end
最後にend
を置くのはif文と同じ. 変数を10, 9, 8, …と動かす方法がまだ分からず書かなきゃいけないプログラムが進まない…
とりあえず普通に
for i in 1:10 k = 11-i ~ end
って書けばいいか
while文
a = 1 while a <= 10 println(a) a = a + 1 end
無限ループを作ってbreak
で抜けたいときは,
a = 1 while a>0 println(a) if a == 10 break end a = a + 1 end
とこんな感じ. if文が1行であろうとend
を忘れてはならないようです.
出力に関して
if文書いててこれを先に書くべきだったかと…
println
で改行付きの出力ができる. JULIA言語はCなどと違って変数の型宣言をする必要がないので, %f
とか%d
とかは必要なく,
a = 1 println(a)
って感じ.
横にデータを並べて間に空白を入れたいときは
print(a) print(" ") println(b)
って感じにしてる. (print
は改行されない) もっと簡単な方法あるのかな…
ファイル出力の際は,
fp = open(hoge.dat) print(fp, a) print(fp, " ") println(fp, b) close(fp)
こう. open
でファイルを作り, print
のときにファイルポインタを指定.