コンパイラが最適化に失敗した?
このコードを-O3オプションでAlchemy使ってコンパイルしたら、#0と#2の値が違った。
#include <math.h> #include <stdio.h> struct ST { double m00; double m01; double m02; double m03; }; void k(int t,struct ST s) { double c; double d; if(t==0){ int i=0; c=s.m02; d=s.m03; printf("%f,%f\n",c,d); printf("#1>%f\n",atan2(c,d)); }else{ int i=0; c=s.m00; d=s.m01; printf("%f,%f\n",c,d); printf("#2>%f\n",atan2(c,d)); } } int main(int argc,char* argv[]) { printf("#0>%f\n",atan2(0.049268,-0.968404)); ST s; s.m00=0.049268; s.m01=-0.968404; k(1,s); return 1; }
$ sample/debug.exe /cygdrive/d/application.files/flex_sdk_3.3.0.4852/bin/adl.exe c:\\cygwin/tmp/t3a 7b4.0/app.xml 2> /tmp/adl.trace & echo $! #0>3.090761 0.049268,-0.968404 #2>-1.519965
atan2がテンプレートだからか?
追記
どうも、Alchemyに入ってるライブラリavm2-libc.l.bcのatanの実装がおかしいらしい。atan(y,x)のはずが、atan(x,y)になっている?
avm2-libc.l.bcにパッチ当てて修正する方法までは判ったんだけど、公開していいかどうかAdobeに問い合わせ中・・・。
公開OKがでたら、修正方法とかを書きます。