2

次のプログラムは、最適化オプションに応じて、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 の問題に関連している可能性があります。

4

0 に答える 0