下記pdfに書いてるlocaleなんて使わないから大丈夫って思ってる人もいはるかもしれない.
でも注意書きに書いたように外部ライブラリが変更してるかもしれないし(昔のMySQLのクライアントライブラリがやってたことがある), 例えばWindowsだとwcoutでワイド文字列を出すには最初に
std::locale::global(std::locale(""));とかして設定しておかないといけない. そうなったときにstream系全てに依存してしまうというのは覚えておいたほうがよいと思う.
#include <iostream>
#include <locale>
#include <boost/lexical_cast.hpp>
int main()
{
/*
デフォルトロケールを設定
これが無いと"こんにちは"は表示されない
*/
std::locale::global(std::locale(""));
std::wcout << L"こんにちは" << std::endl;
/* 端末の設定が日本語だと例外にならずに123456になってしまう */
std::cout << boost::lexical_cast<double>("123,456") << std::endl;
}
パソコン, もう一度掃除をして埃をとる. 録画が不要になったので不安定要素を少しでも取り除くためにチューナーカードを外す.
今のところ安定してる.
本当はVAIO type-Rの後継機を買いたかったのにモニタ別売の機種は出ないし(テカテカモニタは見れたものじゃない), そもそもSandy Bridge当分出そうに無いし.
というわけでパソコンで見るのを諦めてテレビを買うことにした. ついにデジタルだ.
考えてみれば昔からビデオデッキやMD, CDプレーヤや携帯音楽プレーヤやテレビなどを一度も買ったことが無い.
今回が自分で買ったパソコン以外の初めてのAV機器になるのかな.
基本録画してしか見ない, 見たら消すという使い方.
大きいのは要らないけどfullハイビジョンは欲しい条件で去年調べてたときはREGZAの録画ありの32インチかなと思ってた.
ところが, よく見るとAVCには非対応なんだなあ.
HDD増設は面倒だし, AVC優先で探すとAVC同時録画可能なものってざっと見た限りではBRAVIAしかないんやね(32インチより大きいのは対象外).
で, その時点でfullハイビジョンは諦めるわけで, それなら32インチじゃなくて26インチでいいやとなって結局KDL-26EX30Rに決定. 5年保証つけて約8万3千円.
初見の感想は, (想像はしてたけど)起動が遅いこと. まあ仕方ないか. 色は意外にも明るすぎず落ち着いた感じ. 流石に綺麗. 暗いシーンが真っ暗で何やってんのか分からなかったのも見える.
アンテナケーブルが別売なのを知らなくてちょっと困った. 押し入れを探して余ってた一本をつけることにした. これだとBSが映らないけどまあいいか.
PC入力端子(RGB)があるので今使ってる24インチのWUXGAと横に並べてデュアルモニタで使うことも出来る.
ブルーレイプレーヤも内蔵なので手持ちの数少ないDVDを再生してみようと思って入れてみると…表示できませんと出る.
あれリージョン2なのにと思ってよく調べたらPAL非対応だった. なんと.
パソコンでしか見たこと無いから全然知らなんだし気にもしなかった.
パソコンが, ブルー画面にもならず何の前触れもなくリブートしてしまう現象が今日だけで5, 6回発生.
本当に寿命が近そうだ. Sandy Bridgeが出るまで持ってほしい.
西尾さんが確率変数が変数なのか写像なのかよく分からないと言ってて, まあ厳密な定義は難しいし, なんとなくでいいんじゃないのという話になった(比喩を使うといつまでもわかったような分からないようなものだから).
とは言え少しはちゃんと見てみようかという気もする(私は確率論を勉強したことがない).
で, 岩波数学辞典の定義から
○ 確率空間(Ω, F, P)とは
- Ω : ある集合
- F : Ωの部分集合でσ加法族であるもの
- P : F → R(実数全体)
- P(E) ≧ 0
- E1, E2, ...が互いに素ならP(∪Ei) = ΣP(Ei)
- P(Ω) = 1
満たすものを言う. σ加法族は置いといて, もう少し定義を続けよう.
- Ωの元を標本点
- Fの元を事象
- 事象E(∈ F)に対して,P(E)を事象Eの確率
という. こちらはまあよさそう. では定義を見直してみよう.
Ωは考えている対象の空間. たとえばコイントスならΩ = {表, 裏}, サイコロならΩ = {1, 2, 3, 4, 5, 6},
宝くじならΩ = {1等, 2等, 3等, はずれ}, [0, 1]区間の一様分布ならΩ = [0, 1]とか.
σ加法族
集合の演算(合併, 共通部分, 補集合)の可算無限回の操作(***)で閉じているもの.
つまり,A ∈ FならAの補集合AcもFの元, A, B ∈ Fなら A∪B ∈ F, A∩B ∈ Fとなっているものをいう.
これは,事象Eの確率P(E)を考えるなら,その余事象の確率もP(Ec)も当然考えたい. とするとPの定義域にEcも入ってないと困る.
同様にP(A∪B)とかP(A∩B)も考えたいからそれらも入ってて欲しい. その操作は可算無限回ぐらいはしたいよねと.
ここで, 「なぜF="Ωの部分集合全体"としないのか」という質問があった.
素朴にはそれでいい. 実際Fが有限集合ならそれで何も問題ない.
ただΩ = [0, 1]やR(実数全体)などのときに困ることがある. そういう時に確率を計算するとき積分が入ってくるのだけど,
Rなどの部分集合の中には測度(面積)が定義されないものが存在する.
そういうへんちくりんなものは取り除いておきたいという気持ちがそういう定義になっている.
Pの条件は素朴に持ってる確率のイメージを素直に書き下したもの.
2)の条件と3の条件から空集合Φに対してP(Ω∪Φ) = P(Ω) + P(Φ)となってP(Φ) = 0.
P(A∪Ac) = P(A) + P(Ac)からP(A) ≦ 1も出る.
ざっくりいうと確率空間(Ω, F, P)とは, 事象の全体Ωと, Ωの"都合のよい"部分集合全体Fと,
Fの各元に素朴な確率を割り当てたものである.
では変数なのか確率なのか写像なのか言葉で言われてもよく分からない確率変数の定義を見てみよう.
○ 確率変数とは
(Ω, F, P)を確率空間とする. X : Ω → RがF可測なとき,Xを確率変数という.
なんとXとは標本の全体から実数全体への写像であった.
F可測というのは任意のa ∈ Rに対して,X-1((-∞, a))={ w ∈ Ω | X(w) < a} ∈ Fであることを言う.
(-∞, a)の逆像がFの元ならその補集合[a, ∞)cの逆像もまたFの元になる.
区間[a, b)は [a, b) = (-∞, b) ∩ [a, ∞)なので[a, b)の逆像もFの元になる.
∩[a, b+1/n) = [a, b]なので[a, b]の逆像もFの元, (a, b)の逆像もFの元...
というわけで,これは区間(a, b)から(***)の操作でできる全ての集合(これをRのボレル集合B(R)という)の逆像もFの元ということを含んでる.
Rの部分集合全体の集合2Rの中にはルベーグ可測という積分が出来てうれしい部分集合の全体L(B)がある.
そして, ボレル集合B(R)の元は全てルベーグ可測である. つまり
ボレル集合 ⊂(=ではない) ルベーグ可測集合 ⊂(=ではない) Rの部分集合全体
という関係がある. B(R)はL(R)より真に小さく, L(R)は2Rより真に小さい.
まあ, でもここではそういう細かいところは置いておこう.
○ 確率空間(Ω, F, P)と確率変数 X : Ω → Rがあったときに,
φ : B(R) → [0, 1] を φ(A) = P(X-1(A)) で定義してみる.
Xの定義からB(R)の元Aの逆像X-1(A)はFの元であるから確率Pを求めることができる.
φは確率の性質を満たしているのはほぼ明らか. つまり(R, B(R), φ)という組は確率空間になる.
要はいつまでもΩ = {表, 裏}とかでやってたくないのでざっくりRにマップして(R, B(R), φ)で考えたいという意図である(本当かな).
具体的に見てみよう. 確率空間は
(Ω={表, 裏}, F = {Φ, {表}, {裏}, {表, 裏}}, P({表}) = P({裏}) = 1/2)
である. 確率変数を
X({裏}) = 0
X({表}) = 1
とする. X-1(0) = {裏}, X-1(1)) = {裏}, X-1([0, 1]) = {表, 裏}となる.
そうするとφ(0) = 1/2, φ(1) = 1/2, φ([0, 1]) = 1となる.
φ = P・X-1をPと同じものとみなしてP(X = {裏}) = 1とか書くことがある.
同様に正規分布の場合はΩ = R, F = B(R), P(A) = 1/√(2π)・∫A exp(-x2/2) dx, X : R ∋ x → x ∈ Rとしてみる.
本当はx ∈ Rに対して
P(X^-1([-∞, X(x)))を考えているのだけど, これをざっくりP(X ≦ x)とかいたりする.
まとめると, 部分集合全体を考えたいのだけど, それだと病的なケースがあるのでそれを避けるために都合のよい部分集合を考えた.
確率空間がいろんな形をしてると面倒なのでR上で考えるように確率変数という写像を用意した.
素朴な確率の表記と整合性をとるところでP(X-1(X(A)))をP(X=A)と略記した. ということでよいのかな.
C++のSTLアルゴリズムには関数ポインタよりも関数オブジェクトを渡そうという話
>関数のアドレス値はプログラム実行時に決まる.
そんなことない. 仮想関数の場合は, 実行時にどれを選ぶかが決まるけど普通の関数のアドレス値はコード生成時に決まる.
だからその関数が大きくなくてinline指定されてるならインライン化されるんじゃなかろうか.
少なくとも"インライン化できない"という理由は間違ってる.
もちろん, その関数が別のcppにあってglobal最適化されないなら関数呼び出しになってしまうことはあるけど, inline指定うんぬんがあるのでそれを言ってるのではないよね.
どんなgccで試したのか書いてないけどgcc 4.5なら-O2で同一のコードを生成した.
関数ポインタの場合 関数オブジェクトの場合
.L5: |.L4:
addl $1, (%edx) | addl $1, (%edx)
addl $4, %edx | addl $4, %edx
.L16: |.L15:
cmpl %edx, %ecx | cmpl %edx, %ecx
jne .L5 | jne .L4
addl $1, %eax | addl $1, %eax
cmpl $99, %eax | cmpl $99, %eax
jg .L18 | jg .L17
movl %ebx, %edx | movl %ebx, %edx
jmp .L16 | jmp .L15
.L18: |.L17:
testl %ebx, %ebx | testl %ebx, %ebx
je .L13 | je .L12
VC2008でも同一.
$LL3@main:
mov eax, edx
cmp edx, ecx
je SHORT $LN45@main
$LL56@main:
inc DWORD PTR [eax]
add eax, 4
cmp eax, ecx
jne SHORT $LL56@main
$LN45@main:
sub esi, 1
jne SHORT $LL3@main
ランニングシューズがすり減ってきてたので新しいのを買った. 11000円ぐらい. 前回はかなり軽かったけど今回はどっしりした感じ. 体重計で量ると100gぐらい重たい?
靴は1~2年で買い換えるものらしい. とするとランニングコスト(おお, しゃれではない)は割と高いんやな.
早速vpextrwに関するバグ報告があったので
update.
単体テストで比較対象に使ってたnasmもバグってるぽい.
vpextrw ecx, xmm2, 2
をアセンブルするとC5 F9 C5 CA 02 --- (A)が正しいはずなのにC5 F9 C5 D1 02 --- (B)になっていた.
いろいろ調べてたらマイクロソフトのmasmも同じバグを踏んでる感じ.
masmが間違うとは思いにくいけどマイクロソフトのデバッガやIntelのAVXエミュレータでは(B)のコードは'vpextrw edx, xmm1, 2と解釈されていたので多分masmが間違ってる.
ところで64bitモードでvpextrw rcx, xmm2, 2は上位bitが0拡張されるのでvpextrw ecx, xmm2, 2と同じコードになっていいと思う.
IntelのマニュアルにもREX.Wは無視されるとあるし. ただXbyakではその部分の単体テストの都合上yasmに合わせた.
というわけで, vpextrw rcx, xmm2, 2は今のところ1byte無駄なコード生成をする.
・xgetbvの件について
yottuiさんから実はVC++には既にあると
教えていただいた. ありがとうございます. gccはinline asmを使えばいいのでこれは解決.
uint64_t getXfeature()
{
#ifdef _MSC_VER
return __xgetbv(0);
#else
unsigned int eax, edx;
__asm__ volatile("xgetbv" : "=a"(eax), "=d"(edx) : "c"(0));
return ((uint64_t)edx << 32) | eax;
#endif
}
・FMAってSandy Bridgeには入ってないのか(ということをついさっき知ったほど何もしらない). 実装しなくてもよかった.
・VEX.Wに関してIntelの日本語の
マニュアルの説明が分からなくてえらい苦労していた(翻訳が悪いというわけじゃない).
なんとか理解して実装が終わってから, そういや
英語版ではどうなってるのだろうと見たらW0とW1の他にWIGという項目が増えていた!
日本語版はバージョンが古かったのか. うかつだった.
この3日間, ひたすらXbyakをAVXに対応させていた. とりあえず
β版公開.
一気に数百命令増えたのでかなり大変だった. ニーモニックによって引数が微妙に違ったりするので結局一つずつチェックした.
おかげでnasmのバグ(多分)もいくつか見つけた.
ToDo: リファクタリング, AVXが使えるかの判定(xgetbvのintrinsicがVC++に見当たらないけどどうしようか).
実機が欲しいな. FMAの代替ニーモニック. vfnmadd231sd()なんて大変だよな.