2014-01-23 2 views
0

Это может быть тривиально, но я не мог понять, почему это происходит.Данные, поврежденные в stringstream

Я пытаюсь добавить данные типа «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 

Спасибо всем за ваши комментарии. Я узнал, что это действительно тривиальный вопрос. Мне просто нужно использовать фиксированную и showpoint с выходной строкой.

+1

Что такое повреждение? Строки типа 4.45e-321 являются значениями для metalLayerV [metalNum] .getThick(), правильно? – Mine

+1

@Mine Ну, они, вероятно, не правы, так как 'DBL_MIN', вероятно, около' 2.225E-308'. Когда вы оказываетесь в подобном подобном случае, есть что-то не так, как вы их вычисляете. Или в вашем выборе размеров --- измерение толщины алюминиевой фольги в парсеках (хотя в IEEE-диапазоне имеется достаточный диапазон, даже если это не вызовет проблем). –

+1

@WernerHenze Я не думаю, что это проблема. Формат вывода в 'std :: cout' предполагает, что он был установлен в формат' fixed', поэтому точность задает число цифр после десятичной (и для него должно было быть что-то вроде '320' для начала видя ненулевые значения). –

ответ

0

Вы не показывают большую часть значительного кода, так что я могу только предположение, но априори, это выглядит, как вы установили стандарт к фиксированного формата, поэтому он будет показывать только шесть знаков после запятой (и любое значение менее 0.0000005 будет отображаться как 0.000000), но ваш ostringstream по-прежнему установлен на по умолчанию (или в научном формате). И предположит, IEEE с плавающей точки, значение вы показываете показать постепенное опустошение, , что означает, что они очень, очень близко к 0.0, но не 0.0 (и что, вероятно, некоторая небрежность участия в так, как они были рассчитаны) ,

+0

I сделал ничего существенного, просто попытался распечатать значения с помощью простой переменной и с помощью stringstream. Оба должны печатать одинаковые значения, но, похоже, это не так.Хотя я использовал ту же ценность «metalLayerV [metalNum] .getThick()» с cout и stringstream. –

+0

@crazy_prog Оба печатают одни и те же значения. Но используя разные форматы, они _look_ разные (и округлены по-разному). Из вывода видно, что вывод в '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 

Это может быть единственным объяснением вашей продукции.

Смежные вопросы