みやびの備忘録

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

多倍長計算

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}

って感じで数式書いてて,
f:id:miyabi-mathematics:20170105124637p:plain
おっ, ちゃんと揃えられるじゃんarray優秀~って思ったら, 数式番号は全体に一つしかつかない…

\begin{align}
  a&=1 &  &(i=1,\, 2,\, \ldots,\, 10)\\
  a&=2 &  &(i=11,\, 12,\, \ldots)
\end{align}

なんだ. alignの中に&をたくさん(?)ぶち込めば揃えられるじゃん.
f:id:miyabi-mathematics:20170105123807p:plain

ただ, 気になるのは真ん中の空間が長すぎること. \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のときにファイルポインタを指定.