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 ;
}
}