06
11月 09

私もうfloatくんのこと…信じられない…!

ざわ…ざわ…

#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になるとか、ごにょごにょといろいろあるらしいのだけれど、解説はまた気が向いたら。ぼくに理解可能ならば。

posted on 2009-11-06 (金) 6:15 | Tags:
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

posted on 2009-11-02 (月) 20:50 | Tags:
26
10月 08

OpenCVとOpenGLを連携させるサンプルを公開しました

六月頃に研究室の課題でやったんだけど、ネット上でいいサンプルがなかったんで公開することにした。
OpenCVとOpenGLを連携させるサンプル

あと思いつきで英語版も書いといた。
OpenCV+OpenGL

やっつけ仕事なんですごく粗があると思うんだけど、それでも何かの役には立てるかなあと思って。
おそらくこういう課題って少なくないと思うので、学生が真似しまくって「おまえらみんなこのページのままじゃねえかボケ!」みたいな現象でも起きれば楽しいなあというむちゃくちゃな動機ですが。
これでバグでも含まれてれば最高なんですが、まあそのときはこっそり教えてください><

posted on 2008-10-26 (日) 1:34 | Tags: ,
07
1月 08

2038年問題にぶちのめされる前にXSSにぶちのめされるところだった

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

posted on 2008-01-07 (月) 12:50 | Tags: ,
Page 1 of 3123