printf("%.13a\n", 0.1); >0x1.999999999999ap-4
#include <stdio.h> int main() { double x = 0.1; printf("%.17f\n", x); double sum = 0; for (int i = 0; i < 10; i++) { sum += x; } printf("%.17f\n", sum); } >0.10000000000000001 >0.99999999999999989同じだ(Pythonでも同じだった). 0.1は2進数表記で無限小数になるので大きいほうに丸められて0.10000000000000001になるのはいいとして, 0.1より大きいものを10回足したのに, なぜ1を超えないのだろう. 少し考えるとすぐわかるのだけど, でもパッと見は不思議だ.
twice twice twice twice add1 0のtwiceが作用する空間はそれぞれ違うんだなあ. 空間XからXへの写像全体をM(X)として, 上記コードをそれぞれのtwiceを区別するためにt''' t'' t' t a 0と略記するとt∈M2(X), t'∈M3(X), t''∈M4(X), t'''∈M5(X).
t' t a = t(t(a)) = t(aa) = aaaa = a4
t'' t' t a = (t4)(a) = (t3)(a2) = (t2)(a4) = t(a8) = a16
t''' t'' t' t a = (t16)(a) = (t15)(a2) = (t14)(a^(22)) = (t13)(a^(23)) = ... = a^(216)
ところで, 下手な英語だと馬鹿にする人が多いのに驚いた. そういう人は日本語を母国語としない人が下手な日本語をしゃべったら同様のことをするのだろうか.
ちゃんとしゃべれないと話しちゃいけない気持ちを持たせるのが日本の英語教育の悪い点な気がする. 少なくとも, 学校で習ったのは「正解」だけだった. 伝わらなかったら別の方法で言ってみよう, もっぺん言ってみようと教えてもらった記憶はない. 教科書的正しい答えでしゃべろうとして考えてる間に結果的に黙り込んでしまうことになる(自分は).
何度か一対一で英語でしゃべらないといけない場面になったときは, 本当に文法も発音もめちゃめちゃだったけど, 繰り返して紙と鉛筆も使っていればある程度は伝わった(まあ両者エンジニアだったからというのもあるけどね). そんとき, ああそういうもんか(伝えるのが最優先なんだよ)と開き直れた(結果, 上達意欲が薄れた…えっ). まあ, そんな意図も入ってるなら公用語もありかも. んー, でもやっぱり悩むな.
struct Test1 : public Xbyak::CodeGenerator { explicit Test1(int lp) { for (int i = 0; i < lp; i++) { Xbyak::util::setEipTo(this, eax); } ret(); } int (*get() const)() { return (int (*)())getCode(); } }; struct Test2 : public Xbyak::CodeGenerator { explicit Test2(int lp) { for (int i = 0; i < lp; i++) { call("@f"); L("@@"); pop(eax); } ret(); } int (*get() const)() { return (int (*)())getCode(); } };ベンチマーク
call func[lp=1] | call + pop[lp=1] | call func[lp=10] | call + pop[lp=10] | |
---|---|---|---|---|
Core2Duo | 10.01 | 14.00 | 4.70 | 3.30 |
Core i7 | 23.55 | 14.00 | 11.00 | 5.15 |
Opteron | 14.24 | 11.59 | 9.56 | 4.76 |
... for (...) { for (...) { a += b * c; d = f(a, b) + e; ...的なのをみたことがある. なんで式の途中でそんなに改行するねんと思ったら, 深いネストと80カラム制約とを両立させるために編み出された答えだったっぽい. 殆ど縦書きである.
int func(int a) { if (a <= -32768) a += 65536; if (a >= 8192) a -= 8192; if (a >= 4096) a -= 4096; if (a >= 256) a -= 256; if (a >= 8) a -= 8; if (a >= 4) a -= 4; if (a >= 2) a -= 2; if (a == 0) { return 1; } else { return 0; } }みたいなの. ファイル属性が読み出し専用か(何か)調べたかったらしい. 要は(a & 1) == 0なんだが, 各数値は多分システムヘッダを調べたんだろうなあ.
人間は生まれつき「自由」なのでもなく, 「自由」であるべきというのとも違う. 少しでもより「自由」たろうとする本性を持っている. 「自由への探求」が本質.
fが可測なので∫01f(x + y)dx = ∫01f(x)dx + ∫01f(y)dx = ∫01f(x)dx + f(y). よってf(y) = ∫01f(x + y)dx - ∫01f(x)dx.
ここでy→0のときf(y)→0を言いたい(一点でも連続が言えれば後は簡単).y→0のときf(x + y)→f(x)だから積分と極限操作の順序を入れ換えられればOK. Fubiniの定理を使うんだっけ. 仮定はなんだっけか. ある可測関数で|f(x + y)|を抑えられることだったかな. [0, 1]区間で有界ぐらいの条件がいるのかな. 実家にある本かノートを見たい. うーん, kikxさんのつっこみを期待しよう.