AIX6.1上GCC4.4的长双精度计算不正确

AIX6.1上GCC4.4的长双精度计算不正确,gcc,aix,Gcc,Aix,以下程序在AIX6.1下使用GCC4.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 )

以下程序在AIX6.1下使用GCC4.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;
}
对于-O或-mlong-double-64,输出是正确的

  ::powl(2,2)=4.000000
std::pow(2,2)=4.000000
这个问题在GCC4.6和GCC4.7中并不存在,但是,我无法轻松切换到更新的GCC版本。等效的C程序在有优化和没有优化的情况下都能正常工作,所以我假设libstdc++有问题


有人能证实这个问题吗?这可能是一个相关的问题

在mingw32-g++上编译。
a
是否包含正确的值?如果使用
std::cout
而不是
printf
来输出值会怎么样?这没有帮助。与std::cout的输出相同。是的,a=2.0。
  ::powl(2,2)=4.000000
std::pow(2,2)=4.000000