2016-12-30 5 views
1

は、小数点以下3桁までの浮動小数点数を印刷することを意図して、次のプログラムを、考えてみましょう大きな数字のためのstd ::固定を無視します:C++ Builderは

#include <iostream> 
#include <string> 
#include <sstream> 
#include <iomanip> 

int main() { 
    double val = 1.234567890e50; 

    std::stringstream ss; 
    ss << std::fixed << std::setprecision(3); 
    ss << val; 

    std::cout << ss.str() << std::endl;  
    return 0; 
} 

この番号は正確に二重のように表すことはできませんが、今は無関係です。エンバカデロC++ Builderの10.1(コンパイラbcc32cバージョン3.3.1)で

GCC 5.1で

、プログラム印刷

123456789000000004671007453916432257001527036608512.000

、出力は次のとおり

1.234567890000000047000000000000000000000e +50

C++ Builderの出力が、選択された浮動小数点表記(std::fixed)と一致しないのはなぜですか?番号が10^300の場合でも、GCCは選択した表記法を使用してそれを示します。

なぜこれらの2つのコンパイラは異なる動作をしますか?この場合、文字列変換がどのように機能するかをC++標準で定義していますか?

+0

Upvoted。この質問には、私が最初に感謝しなかった深みがあります。 – Bathsheba

答えて

1

Embarcadero C++ Builder 10.1にはバグがあります。

std::setprecision(3);に関わらず、そのプラットフォーム上の浮動小数点方式はその番号を表すことができるかどうかの、に正確後に小数点を表示する桁数を設定します。

GCC5.1はこれに準拠しています。

Embarcadero C++ Builder 10.1はありません。

http://en.cppreference.com/w/cpp/io/manip/setprecisionを参照してください。これはC++標準をかなりプロキシします。

+0

最初にスティックの端が間違っていた。謝罪します。 – Bathsheba

関連する問題