次のプログラムは、最適化オプションに応じて、AIX 6.1 で GCC 4.4 を使用してコンパイルすると、間違った出力を生成します。
#include <cmath>
#include <stdio.h>
int main()
{
const long double a = 2.0L;
long double x = ::powl( a, a );
printf( " ::powl(2,2)=%Lf\n", x );
long double y = std::pow( a, a );
printf( "std::pow(2,2)=%Lf\n", y );
return 0;
}
最適化せずにコンパイルすると、出力が間違っています。
::powl(2,2)=1.000000
std::pow(2,2)=1.000000
-O または -mlong-double-64 を使用すると、出力は正しくなります
::powl(2,2)=4.000000
std::pow(2,2)=4.000000
この問題は GCC 4.6 および GCC 4.7 には存在しませんが、新しい GCC バージョンに簡単に切り替えることができません。同等の C プログラムも最適化の有無にかかわらず正しく動作するため、libstdc++ に何か問題があると思います。
誰でもこの問題を確認できますか? これは生の double 型比較に関する GCC の問題に関連している可能性があります。