naoya_t@hatenablog

いわゆるチラシノウラであります

6log6≠6log6

先日のこどふぉ#484のB問題(agwたんから聞いた)
B. High School: Become Human

xとy(それぞれ1以上10^9以下の整数)が与えられてx^yy^xの大小を比べるだけの問題。

y\log xx\log y の比較に置き換えれば簡単なはずなんだけど、ローカルでは何の問題もないのにサーバ上ではあたかも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