06
11月 09
ざわ…ざわ…
#include <stdio .h>
int main() {
float x = 16777216.0;
printf( "x = %f\n", x );
x += 1.0;
printf( "x+1.0 = %f\n", x );
x = 16777217.0;
printf( "16777217.0 = %f\n", x );
return 0;
}
出力:
x = 16777216.000000
x+1.0 = 16777216.000000
16777217.0 = 16777216.000000
16777217 = 16777216
そうかわかった人類は滅亡する!
浮動小数は基本的に数が大きくなればなるほど精度(表せる数の幅)が大きくなるとか、16777215で仮数部が最大値となって指数部が繰り上がることによって数字の最小単位(分解能みたいなもの?)が2になるとか、ごにょごにょといろいろあるらしいのだけれど、解説はまた気が向いたら。ぼくに理解可能ならば。
02
11月 09
C/C++の話題。あんまり頭働いてない状態でコード書いてたら引っ掛かった!
なさけない話題なので書くの恥ずかしいんだけれど、教訓として残しておく。
int sum = 0;
for ( int i = 0; i < 10; i += 1 ) {
cout << i << ", ";
sum++;
}
cout << "num of loop execute: " << sum << endl;
たとえば上のようなコードだとループ内は10回実行されるのは当たり前なんだけれど、
下の場合はループ回数は不定となる(たぶん環境によりばらつきがある)。ぼくの環境では11回実行された。
int sum = 0;
for ( double i = 0.0; i < 1.0; i += 0.1 ) {
cout << i << ", ";
sum++;
}
cout << "num of loop execute: " << sum << endl;
他の例として、以下の例ではループが終了せず無限ループに入る。
ループ終了条件が != になってるだけです。
int sum = 0;
for ( double i = 0.0; i != 1.0; i += 0.1 ) {
cout << i << ", ";
sum++;
}
cout << "num of loop execute: " << sum << endl;
原因は、 11回目の実行時にdouble i が1.0であるにも関わらず i < 1.0 の終了条件を通ってしまうから。
3つ目の例での変数 i は、0.1ずつインクリメントしていっても(つまり0.0に10回0.1を足しても)厳密に「i == 1.0」にはならない可能性がある。
double, float等の浮動小数点は、完全に表現できない値がある。
たとえば0.1という数字は二進数にすると循環小数になり、そこで誤差が生じる。
まあ普通の計算では問題になりにくい程度の誤差だけれど、それをループ終了条件に用いた場合に誤差が効いてくる、ということ(だと思う)。
対策としてはループ終了条件を整数としてとれるように工夫する、ということくらいしか思いつかないのだけれど…
どこかで一度目にした教訓だったと思うのだけれど、実際に遭遇するとなかなか時間とられるなあ。
無限ループって怖くね?
ref: 無限ループ – Wikipedia
26
10月 08
六月頃に研究室の課題でやったんだけど、ネット上でいいサンプルがなかったんで公開することにした。
OpenCVとOpenGLを連携させるサンプル
あと思いつきで英語版も書いといた。
OpenCV+OpenGL
やっつけ仕事なんですごく粗があると思うんだけど、それでも何かの役には立てるかなあと思って。
おそらくこういう課題って少なくないと思うので、学生が真似しまくって「おまえらみんなこのページのままじゃねえかボケ!」みたいな現象でも起きれば楽しいなあというむちゃくちゃな動機ですが。
これでバグでも含まれてれば最高なんですが、まあそのときはこっそり教えてください><
07
1月 08
http://www.masayashi.com/2008/01/05/536
王様は2038年にぶちのめされる前にXSSの対処をされることをお勧めいたします.
via: 王様に提言 – よくきたはてダ
うおー!ありがとうございます!
ご指摘を受け、以下のようにコードを一部改変しました。『受け取ったデータはhtmlspecialcharsかけようね』という指摘だと解釈しました。
$month = $_POST{'month'}; //月を受け取る
$day = $_POST{'day'}; //日を受け取る
↓ XSS対策
$month = htmlspecialchars($_POST{'month'}); //月を受け取る
$day = htmlspecialchars($_POST{'day'}); //日を受け取る
重ねて、今回のご提言に深く感謝します。
今後も至らない点が見受けられましたら、ご指摘いただければ幸いです。
2008/01/07 12:43 masayashi