2014-01-23 112 views
0

這可能很平凡,但我不明白爲什麼會發生這種情況。串流中數據被損壞

我試圖將「double」類型的數據追加到stringstream中,但它似乎被損壞。對此有何見解?

for (int metalNum = 0; metalNum< r_maxMetalNum; metalNum++) 
{ 
    if ((unsigned int)metalNum >= metalLayerV.size()) return false; 

    if (metalLayerV[metalNum].getThick() >= 0) 
    { 
     if (metalNum != 0) metalThickSS << ","; 
     cout << "JJJJ..." << metalLayerV[metalNum].getThick() << "\n"; 
     metalThickSS << std::setprecision(3) << metalLayerV[metalNum].getThick(); 
    } 
} 

cout << "Hello " << metalThickSS.str() << "\n"; 

輸出是:

JJJJ...0.000000 
JJJJ...0.000000 
JJJJ...0.000000 
JJJJ...0.000000 
JJJJ...0.000000 
JJJJ...0.000000 
JJJJ...0.000000 
JJJJ...0.000000 
JJJJ...0.000000 
JJJJ...0.000000 
Hello 4.45e-321,4.45e-321,4.45e-321,4.45e-321,4.45e-321,4.45e-321,4.45e-321,4.45e-321,6.18e-320,6.18e-320 

感謝所有爲您的意見。我發現這實際上是一個微不足道的問題。我只需要使用輸出stringstream使用固定和顯示點。

+1

什麼是損壞的?像4.45e-321這樣的字符串是metalLayerV [metalNum] .getThick()的值,對不對? – Mine

+1

@我好吧,他們可能是不對的,因爲'DBL_MIN'可能在'2.225E-308'附近。當你最終得到這樣的低於正常值時,你計算它們的方式會有一些錯誤。或者選擇尺寸---測量parsecs中鋁箔的厚度(儘管在IEEE的雙倍範圍內有足夠的範圍,即使這樣也不會導致問題)。 –

+1

@WernerHenze我不認爲精度是問題。輸出到'std :: cout'的格式表明它已被設置爲'fixed'格式,所以精度指定小數點後的數字位數(並且必須像'320'那樣讓他開始看到非零值)。 –

回答

0

你沒有表現出很大的顯著碼的,所以我只能 猜測,但先驗的,它看起來像您所設置的標準出來 固定格式,所以它只會顯示小數點後六位數字 (以及任何小於0.0000005的值都將顯示爲 0.000000),但您的ostringstream仍然設置爲 默認值(或科學格式)。並假定IEEE浮點 點,正在顯示節目逐漸下溢,這意味着他們是非常,非常接近0.0值, ,但不 0.0(並有可能是一些粗心大意參與 他們計算方法) 。

+0

沒有沒有什麼意義,只是嘗試使用簡單變量和stringstream輸出值。兩者都應該打印相同的值,但似乎不是。儘管我用cout和stringstream使用了相同的值「metalLayerV [metalNum] .getThick()」。 –

+0

@crazy_prog兩者都打印相同的值。但是使用不同的格式,所以它們看起來不同(並且以不同方式舍入)。從輸出結果可以看出,輸出到std :: cout是使用固定格式完成的,但對於ostringstream使用的是科學或默認格式。 –

0

這可能是由代碼中其他位置的cout << fixed造成的。 請參見下面的代碼:

double d = DBL_MIN/10000000000000 * 2; 
    cout << d << endl; 
    cout << fixed; 
    cout << d << endl; 

    stringstream ss; 
    ss << setprecision(3); 
    ss << d; 
    cout << ss.str() << endl; 

它打印

4.44659e-321 
0.000000 
4.45e-321 

這可能是你的輸出的唯一解釋。