以下程序在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 ++有问题。
任何人都可以确认这个问题吗?这可能与GCC problem with raw double type comparisons有关。