2014-01-23 81 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 

这可能是你的输出的唯一解释。