2011-07-18 10 views
0

複雑な計算を行うためにいくつかのパラメータ(すべてタイプdouble)をファイルに書きました。私はそうのようなファイルにパラメータを記述します。より精度の高いファイルに数値を書く - C++

refStatsOutofstreamパラメータである

refStatsOut << "SomeParam:" << value_of_type_double << endl;
。このようなパラメータは、それぞれタイプがdoubleの4つです。ファイルに書き込まれているのが実際の値とは異なります(精度の低下の点で)。たとえば、value_of_type_doubleの値が-28.07270379934792だった場合、ファイルに書かれているものは-28.0727となります。

また、これらの統計情報が計算されて書き込まれると、これらの統計情報を使用するさまざまなプログラムを実行します。ファイルは読み込まれ、最初に値はstd::stringsとして保存され、次にdoubleatofの機能によって変換されます。これは、私が上に示した値をもたらし、計算をさらに崩壊させます。
1.任意の精度を失わないように1がファイルに(タイプdoubleなどの)値を書き込むことが可能な解像度を向上させる方法はあります:

私の質問はこれですか?
2. からdoubleに変換すると、atofで変換できますか?もしそうなら、私はこれを解決するために他にどんな機能を使うことができますか?

P.S:この質問の詳細の一部が明確でない場合はお知らせください。私はそれらを更新して詳細を提供しようとします。

答えて

4

setprecisionの機能を使用できます。

+0

お返事ありがとうございます。しかし、小数点以下の桁数が毎回異なるため、精度を動的に設定できる方法はありますか?それ、どうやったら出来るの? – Sriram

+1

@Sriram - あなたはprintfやfprintfに戻すことができます。柔軟な書式指定子を使用できます。 http://www.cplusplus.com/reference/clibrary/cstdio/printf/ – Leon

3

ofstream your_file;

your_file.precision(X)を使用できます。

precision()とsetPrecision()の主な違いは、precisionは現在の精度を返し、setPrecisionは現在の精度を返します。したがって、このような精度を使用することができます。

streamsize old_precision = your_file.precision(X); 
// do what ever you want 

//restore precision 
your_file.precision(old_precision); 
1

doubleは、私はあなたのコンパイラが64ビットのint型のためlongを使用していることを想定しています注意してください(あなたがそれを書くの安価な方法をしたい場合、あなたはこのような何かを行うことができ、基本的に64ビットの整数であります)

double value = 32985.932235; 
long *saveme = (long*)&value; 

保存された値が異なるアーキテクチャに読み込まれた場合、同じ値にならないことに注意してください。

関連する問題