2011-07-18 65 views
0

我將一些參數(所有類型爲double)寫入文件以用於執行一些複雜的計算。我寫的參數文件,像這樣:以更高的精度將數字寫入文件 - C++

refStatsOut << "SomeParam:" << value_of_type_double << endl;
其中refStatsOutofstream參數。有四個這樣的參數,每個類型double。我所看到的寫入文件與實際值不同(在精度損失方面)。舉個例子,如果value_of_type_double的值爲-28.07270379934792,那麼我在文件中看到的是-28.0727。

此外,一旦這些統計數據已經計算並寫入,我運行使用這些統計數據的不同程序。讀取文件並將值初始存儲爲std::strings,然後通過atof函數轉換爲double。這導致了我上面顯示的值,並使計算進一步下降。

我的問題是這樣的:
1.是否有增加與哪一個可以寫(的double類型等)值到一個文件,以便不丟失任何精度的分辨率的方法是什麼?
2.難道這也可能是std::stringdoubleatof轉換的問題嗎?如果是這樣,我可以使用其他什麼功能來解決這個問題?

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

精度之間的主要區別()和setPrecision()是一個精密返回當前精度和setPrecision沒有。因此,你可以像這樣使用精度。

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

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

一個double基本上是一個64位整數,如果你想要寫出來的一種廉價的方式,你可以做這樣的事情(注意我假設你的編譯器使用long 64位整數)

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

只需提防警告的是,保存的值可能不會保持如果裝回在不同的架構是相同的。