2

C++ システムを、solaris (SUN ボックスと solaris コンパイラ) から Linux (intel ボックスと gcc コンパイラ) に変換しています。大きな「long double」値を処理するときに、いくつかの問題が発生しています。(一部の非常に大きな整数のため、"long double" を使用します... 10 進精度ではありません)。それはいくつかの奇妙な方法で現れますが、私はそれを次のプログラムに単純化しました。数値をインクリメントしようとしていますが、そうではありません。コンパイル エラーや実行時エラーは発生しません...数値が増えないだけです。

また、いくつかの異なるコンパイラ スイッチ (-malign-double と -m128bit-long-double をオンとオフのさまざまな組み合わせで) をランダムに試しましたが、違いはありませんでした。

これを gdb でも実行したところ、gdb の「print」コマンドは cout ステートメントと同じ値を示します。

この動作を見た人はいますか?

ありがとう

コマンドをコンパイルする

$ /usr/bin/c++ --version
c++ (GCC) 4.4.6 20120305 (Red Hat 4.4.6-4)

$ /usr/bin/c++ -g -Wall -fPIC   -c SimpleLongDoubleTest.C   -o SimpleLongDoubleTest.o

$ /usr/bin/c++ -g SimpleLongDoubleTest.o   -o SimpleLongDoubleTest

$ ./SimpleLongDoubleTest
Maximum value for long double: 1.18973e+4932
digits 10 = 18
ld = 1268035319515045691392
ld = 1268035319515045691392
ld = 1268035319515045691392
ld = 1268035319515045691392
ld = 1268035319515045691392

SimpleLongDoubleTest.C

#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <limits>
#include <iomanip>

int main( int argc, char* argv[] )
{
    std::cout << "Maximum value for long double: " 
              << std::numeric_limits<long double>::max() << '\n';

    std::cout << "digits 10 = " << std::numeric_limits<long double>::digits10 
              << std::endl;

    // this doesn't work  (there might be smaller numbers that also doen't work...
    // That is, I'm not sure the exact number between this and the number defined
    // below where things break)
      long double ld = 1268035319515045691392.0L ;

    // but this or any smaller number works (there might be larger numbers that
    // work... That is, I'm not sure the exact number between this and the number
    // defined above where things break)
    //long double ld =  268035319515045691392.0L ;

    for ( int i = 0 ; i < 5 ; i++ )
    {
        ld++ ;

        std::cout << std::setiosflags( std::ios::fixed ) 
                  << std::setprecision( 0 ) 
                  << "ld = "  <<    ld
                  << std::endl ;
    }
}
4

1 に答える 1