以下程序在 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 问题有关。