みやびの備忘録

LaTeXとかjulia言語とか. 覚えておきたいことをつらつら書いています.

配列の初期化(任意精度浮動小数点演算)

新年明けましておめでとうございます.
年越し研究室は避けたものの, 無事プログラミングをしながら年を越したみやびでございます.


配列の初期化は

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のときにファイルポインタを指定.

JULIA言語について

数値計算に特化したプログラミング言語, JULIA言語.

数や文字を結構直感的に(?)扱えたり, 多倍長計算を簡単に出来たりなど, まあなにかと便利なんですよ.
Cで多倍長計算を実装しようとしたとき, どれだけ苦労したことか…結局出来なかったし…

で, デスクトップアプリ上で電卓のようにも使えるんですが, こっちの使い方の解説はそこそこあるのにプログラムの解説がなかなか見つからないんですよこれが. (見つけられてないだけかもしれないけど)

というわけで, これからこのブログ上で私が使った(使えた)文法を書いていく予定でございます.
予定は未定.