誤差にまつわるエトセトラ今日は、浮動小数点小数の数値計算誤差について書こうと思う。以下のコードを実行してみましょう。0;}結果は以下のようになります。>10000000000000000.0000000>1>0>1.000000まず、case1から見ていきましょう。10000000000000000.000000に1を足しても10000000000000001.000000にはなりません。~10^15だからです。最初の15桁以下は丸められてしまいます。逆に言うと、10^15以下の整数ならdoubleで正確に表すことができます。この辺の話は昔投稿しているので、こちらをご覧ください。次に、case2です。これは、おもしろいです。y1とy2をビット列で表すとそれぞれ以下のようになります。10011100実は、この2つの数は、doubleの世界では連続する数値です。それにも関らず、(y1-y2)は1e-5程度です。連続する値なので、ほんの少しのエラーで、ある値がもう片方の値になりえます。数値計算を実施する際は、この2つは、同じ値とみなしてよいでしょう。1e-7)なんてやっちゃうと、この2つの値は、同値とは判定できません。何がまずかったのでしょう・・。doubleは浮動小数点なので、小数点の位置は固定ではありません。絶対的な値を誤差の許容範囲とするには無理があります。y1とするとよいでしょう。これは、やっかいです。y1を判定条件に用いればよいことを示しましたが、case3では、この判定条件は適切ではありません。同値とみなすべきz1とz2が同値とみなされません。符号が異なる2つの微量な数値を比較する場合は、case2の場合は適さないようです。case2とcase3を2つ使って判定しましょう。競技系プログラミングでは、小数が現れないように分母を他辺に掛けるテクニックが有効のようです。比較する値の絶対値が比較的小さいものであれば、絶対評価(case2)だけ十分でしょう。出典)http://www.topcoder.com/tc?module=Static&d1=tutorials&d2=integersReals読んで理解したことを書こうと思ったら、ほぼ和訳みたいになりました(笑)英語が出来る人は、上の原文を読んだ方が分かりやすいはずです。Postsmemset()とmemcpy()恥ずかしながら、Cのmemset()とmemcpy()を今まで使ったことがなかった。みたいな話を聞いたことがあったので、「あーじゃ要らない機能なんだー。editorialに投稿された解答がmems...便利なPythonライブラリ(5)retryデコレータつけるだけで、リトライしてくれるという便利ライブラリ。失敗するかもしれない不安定な関数に@retryをつけると成功するまで実行してくれる。ret...S3のファイルを一般公開するAWSのS3のファイルを一般公開する方法について説明します。2つの場合に分けて説明します。本番中ゴリ押し解を思いつくには思いついたのだが、C++でマルチスレッドの処理を書いたことが無くて、ごにょごにょやってるうちにタイムアップとなってしまった。C++...C#入門(9)Action、Func、Predicateの違いAction、Func、Predicateについて簡単に整理しておく。メソッドへのDelegate。メソッドへのDelegate。スライド区間に対するクエリ処理の種類とそれに対するアルゴリズムをいくつか紹介します。「スライド区間」の定義ですが、窓関数のようなものを想像してください。まではコンピュータの力を使って正多面体をt色以下で塗るパターン数を数えていました。今回は手計算で計算してみようと思います。そのためにはまず回転を表す対称群をうまく列挙するために回転軸について考える必要があります。見聞きする木の用語を整理しておく。節点vから最も離れた節点をwとする。w)の長さをvの離心数と呼ぶ。記号で表すときは、ε(v)と書く。使って遊んでみました。いった便利な機能を提供してくれるテストフレームワークです。repor...キャッシュヒット率の測定perfというツールを使ってキャッシュヒット率を測定してみた。キャッシュの影響なんてたかが知れていると甘くみていたら、痛い目るので要注意。知らない用語がちらほらあったので、簡単にまとめておく。