6log6≠6log6
先日のこどふぉ#484のB問題(agwたんから聞いた)
B. High School: Become Human
xとy(それぞれ1以上10^9以下の整数)が与えられてとの大小を比べるだけの問題。
と の比較に置き換えれば簡単なはずなんだけど、ローカルでは何の問題もないのにサーバ上ではあたかも6log6≠6log6であるかのような振舞いをする。
これは(数学の問題と見せかけて)コンパイラの最適化の地雷をどう避けるかという問題。
// サーバ上だとx=y=6でなぜか落ちる #include <bits/stdc++.h> using namespace std; int main() { int x,y; cin>>x>>y; double lx=log(x)*y, ly=log(y)*x; if (lx == ly) cout << "=" << endl; else if (lx < ly) cout << "<" << endl; else if (lx > ly) cout << ">" << endl; return 0; }
結論からいうとlx,lyをlong doubleにして、log()をlogl() に変えれば通るのだけれど、x=y のケースで、しかも問題文のサンプルの3番目にもあるx=y=6で落ちていて戸惑う。6*log(6)と6*log(6)が違う結果になるとは。(ローカルでは何の問題も起こらないのに)
コンパイラの最適化でそういうことが起こるらしい。期待されている冪等性が担保されない感じが気持ち悪い。
http://codeforces.com/blog/entry/59720?#comment-434225http://codeforces.com/blog/entry/59720?#comment-434361
http://codeforces.com/blog/entry/59720?#comment-434345