2015/03/23(月)MSYS2を試してみる
- macを使う。
- windowsでvmware等の仮想環境を作り、その中でLinux等を使う。
- windowsでcygwinを使う。
- Linux等をマルチブートで使う。
さて、windows環境のままunix系コマンドを使えるようにするソフトウェアとしてはcygwinが有名で長く使われてきていますが、最近MSYS2という同様のソフトウェアのいい評判をよく耳にします。そこで、試しにちょっと使ってみました。
元々、cygwinの亜種でmingw+msysというwindows nativeのexeを生成するソフトウェアがあるのですが、それの後継という位置づけで、
- 比較的アップデートが早く、最新のソフトウェアが使える。
- Arch Linuxで使われているpacmanというパッケージマネージャが使える。
上のページを見ながら、試しにインストールしてみました。インストール先はwindows7 64bit。
- 64bit版のexe (msys2-x86_64-20150202.exe) をダウンロード。
- 普通にインストーラを起動してインストール。デフォルトのc:\msys64に入れた。
- スタートメニューからmsys2 shellを起動、終了、を2回繰り返す。
- msys2 shell上で、最新にアップデートする。
pacman -Sy(repositoryのデータを最新に) pacman --needed -S bash pacman pacman-mirrors msys2-runtime (再起動の必要のあるものを先にupdate) (msys2 shellを再起動) pacman -Su (残りをupdate)
- pacman -Ss 名前 で検索。
- pacman -S 名前 でインストール。
- pacman -R 名前 で削除。
自分は、mingw64_shell.batを常用することにしました。
いくつかパッケージを入れて開発環境を整えてみました。前述したようにgccは3種類ありますが、公式Wikiの"Contributing to MSYS2"にあるように
pacman -S base-devel pacman -S msys2-devel pacman -S mingw-w64-i686-toolchain pacman -S mingw-w64-x86_64-toolchainで主だった開発に必要なものは大体入ります。更に、
pacman -S vim pacman -S mingw-w64-x86_64-boost pacman -S opensshあたりを入れてみました。
この環境でkvライブラリはちゃんとコンパイル出来ました。mpfrを使ったものも、-lmpfr -lgmpを付けるだけでOK。
アンインストールも試してみましたが、コントロールパネルからで普通にきれいさっぱり消せるようです。
gccは4.9.2、boostは1.57.0であり、sshの最近のバグも修正されるなど、最新の環境が楽に使えるのはとてもいいですね。しばらく注目していようと思います。
2015/03/23(月)kv-0.4.19
主な変更点は、
- mpfrである程度以上仮数部の長い数を扱ったとき、e, ln2, piの定数の 精度が不十分なため区間幅が小さくならない問題を修正。
- atanhの端点処理をちゃんとやるようにした。
- ddとmpfrにceilとldexpを追加。
区間演算では、テンプレートを使って、interval<double>ならdoubleにふさわしい精度で、interval<dd>ならdouble-doubleにふさわしい精度で数学関数の計算を行う仕組みになっています。この仕組みで困るのが定数の計算で、定数は入力を持たないのでどの精度で計算すべきか判断できません。そこで、(numeric_limits<T>の使い勝手に倣って) constants<T>::pi(), constants<T>::e(), constants<T>::ln2()を用意し、Tの型によって計算精度を変える仕組みを採用しています。で、これらの実装は、例えばpiなら、
template <class T> struct constants< interval<T> > { static interval<T> pi() { static const interval<T> tmp( "3.1415926535897932384626433832795028841971693993751", "3.1415926535897932384626433832795028841971693993752" ); return tmp; } }のように文字列で上端下端を与えそれを上下に丸めることによって得ていました。この定数は10進数50桁で円周率の上界下界になっています。doubleとddしか無ければこれだけ精度があれば十分だったのですが、mpfrで50桁以上の精度を指定した場合、(精度保証は出来ているものの)定数の区間幅が広すぎてまともな精度が出ない事態になっていました。ここの仕組みを変えて、きちんとその型なりの定数の計算方法を書くようにしました。
2015/03/12(木)kv-0.4.18
0.4.17で、lgammaにdouble以外の型を入れるとコンパイルできないバグを混ぜてしまっていたので修正しました。いつもならもう少し修正が貯まってから公開するのですが、某所でlgammaが必要だったのですぐに公開しました。ついでに、第1種Bessel関数(整数次のみ)の簡単な実装を追加しました。
2015/03/07(土)kv-0.4.17
主な変更点は、
- 特殊関数の説明文を書いた。特にガンマ関数の計算方法の詳細を書いた。
- 内部で例外として使っていたrange_errorをdomain_errorに変更。
- 数学関数を含む常微分方程式が正しく解けないことがあったバグを修正。
2番めの例外についてちょっと補足しておきます。区間演算やaffine arithmeticなどでゼロ除算や負の数の平方根などが出てきたとき、プログラムをただちに停止せず例外をthrowするようになっています。そして、常微分方程式や全解探索などの上位プログラムでは解くべき問題の関数評価をするときにtry-catchでこの例外をcatchし、例外が起きてもすぐに諦めずにステップ幅を小さくしたり区間を分割したりするような実装になっています。この例外として、0.4.16以前はrange_errorという例外を使っていたのですが、どうやらdomain_errorの方がふさわしそうなので、プログラム全体でdomain_errorを使うように変更しました。
普通に使ってるだけならあまり関係のない変更ですが、例えばaffine.hppをコピーして改造して使っているような方がいれば、同じように変更した方がいいでしょう。単に一括置換するだけで大丈夫ななずです。
忙しい1月2月を過ぎて、やりたいこともいろいろ溜まっているのでここから頑張ろう。