めもらんだむ

個人的な備忘録。Julia言語やPythonに関することが中心になると思われます。

Julia言語における浮動小数点型

※断片的な知識の個人的なメモで、体系だった記述ではないと思います。体系だった知識を求める場合には、本家のサイトのドキュメント(https://docs.julialang.org/en/v1/)か成書を読むのがよいと思います。

Julia言語での浮動小数点の型は

  • Float16
  • Float32
  • Float64
  • BigFloat

の4つがある。上3つは、順に半精度(という?)、単精度、倍精度で、精度が固定されており、一番下のBigFloatは任意の精度が設定でき、倍精度を超える変数も定義できる。特にしてしなくとも、BigFloatのデフォルトでよろしくやってくれる。浮動小数点型のデフォルトはFloat64らしい。

Julia言語の変数には階層構造が存在する。一番下のレベルはconcrete typeと呼ばれ、浮動小数点型は上記の4つが該当する。

concrete typeの上の階層は全てabstract typeと呼ばれる。
浮動小数点型に属するconcrete typeを上に辿っていわゆるパンくずリスト的に記すと
Any > Number > Real > AbstractFloat > [Float16, Float32, Float64, BigFloat]
となる。
Fortranから科学計算に入った者からすると、RealとFloatが違う階層という点はちょっと戸惑うところ。
Anyが最上位の階層で、文字どおり「何でもアリ」にあたる。

1つ上の階層を調べるための関数はsupertype、1つ下の下位層を調べるための関数はsubtypes。下の階層にはいくつかのものが存在しうるので、コマンド名が複数形をとっていると思われる。

例えば、非常に小さい数値をとる確率値を考えないといけないとき、隣接する浮動小数点数の距離 (machine epsilon) が計算精度に影響を与えうる。その距離を調べるにはeps関数を用いる。
詳細は
docs.julialang.org
を参照のこと。

プログラムをコンパイルする際の変数の型判断は、この階層構造に沿ってよろしくやってくれるらしいし、自分で指定する場合には型の階層構造を意識することが必要と思われる。

Julia言語のループでは変数のscopeが独立している

Julia言語でwhileやforのループ内で定義した変数をループ外で参照しようとしたところ、定義されていないと出て何が何だか……と思っていたところ、それが仕様で、Julia言語のループでは変数のscopeが独立しており、内部で定義した変数は外部からは参照できない仕様になっていることを知る。
知るきっかけは
discourse.julialang.org
での議論で、本家のマニュアルにももちろん書いてある。
docs.julialang.org

FortranPythonの仕様とは違うのでハマりかかりました。

Julia言語を使ってみた

<追記(2022年11月18日)>
コンパイルのオーバーヘッドが大きいと感じたのは、私の使い方が悪かったようです。
julia (Juliaのコード)
という具合にコマンドを走らせる形がよろしくなかったようです。以下の記事を参照し、REPLというJulia言語のコマンドラインのようなものを通して使うようにすれば、いちいちコンパイルせずに使えるようになりました。コンパイルを待つ時間が減り、大変快適です!!!
qiita.com

但し、exit()があるとREPLから抜けてまた一から(最初からコンパイルするところから)始まるので、コード開発中の動作確認(私はこまめに動作を確認するタイプの人間なのです)には、わざとエラーを起こして止めるようにしてをしています。統合開発環境なるものを使ったことがない(vi一筋25年の)原始人はこうしますが、いい道具を使えばもっとスマートにコード書きができるのだと思います。

〜〜〜〜〜〜〜〜
これまで他人様がPythonで作成したライブラリを使ってきましたが、その枠では収まりくらなくなり、自力で実装することにしました。
残念ながら、自分の技術力もあってかPythonでは処理速度が遅く、早いと噂されるJulia言語に手を染めてみました。
実装の手始めに過ぎない段階ではありますが
コンパイルのオーバーヘッドが大きい
コンパイルが済むと爆速→くり返し計算には強みを発揮
というのが第一印象です。

Fortranが「母国語」の者からすると、配列がインデックスが1から始まるのがデフォルトだったり、多次元配列をメモリに格納する様式がFortranと一緒(CやPythonとは異なる)だったりで馴染みやすくはあります。

処理速度を早くしたいならば変数の型を指定した方がよいとか、当たり前ですが、結局はFortranとかと同じようにあれこれ書き込まないといけないので、Pythonのようなお手軽さは薄まります。
自分がやりたいことがどのぐらいmassiveな計算かを見極めないと、コンパイルやコーディングに時間がかかるというオーバーヘッドが大きい分、やりたいことを実現するのに必要な正味の時間は結局Pythonと大して変わらない(ヘタすると多い)ということになりそうです。

Julia言語でのradian⇔degreeの変換

Pythonだとnumpyを使った記憶があるが、Julia言語では組み込み関数として用意されていて、usingで何らかのライブラリを読み込む必要はない。
radianからdegreeにはrad2deg(hoge)、degreeからradianはdeg2rad(hoge)となる。

参考文献:
www.geeksforgeeks.org

Julia言語の手習い

Pythonよりも早いと噂されるJuliaを使ってみようと調べものをして見て回り、Juliaを知る上で参考になるサイトのブックマークです。過去の経験や蓄積が人それぞれ違う以上、わかりやすさもまた人それぞれで、Juliaを使ってみたいと思っている皆さんにとっていいとは限りません。

 ・Julia Language Programming
お気楽 Julia プログラミング超入門
www.nct9.ne.jp
httpsではなくhttpで繋がりますが、まぁ、Juliaの使い方を見るのにsecureな接続である必要はないでしょう。

Fortranから始めるJulia
cometscome.github.io

緯度・経度から住所を調べる方法

国土地理院のサイトのWeb APIを使ってとてもお手軽にできる。
具体的なやり方(Pythonスクリプトを使った住所の取得方法)は
monzcode.com
に記されている。

市町村コード一覧でまとめられているところはコードになっており、それより細かいところが文字になっている。

市町村コード一覧で記されているのは市町村レベル(東京23区ならば区のレベル)まで。
市町村コード一覧は、総務省のサイトで配布されている(下記参照)が、フリガナに半角カナを使っているという……。
www.soumu.go.jp

用語メモ

住所や地名(もっと広く地物?)から緯度・経度を引けるようにすることをGeoencodingと言うらしい。
逆に、緯度・経度から住所を引けるようにすることをreverse Geoencodingと言い、Geodecondingとは言わないらしい。

LaTeXで外字を使う(Macでの話)

異体字を含めたいわゆる外字(よく考えると、定義をちゃんと理解していない)をTeX LiveでインストールしたLaTeXで使えるようにするのが最終目標。
但し、フォントは埋め込まないと作業環境と違うところでは表示されない可能性があるので、ヒラギノフォントを埋め込む。

続きを読む