2016-04-01 5 views
4

Я испытал эту странную проблему, недавно связанную с cout.setf (ios :: fixed). Мне потребовалось некоторое время, чтобы выяснить причину и подумать, что я попрошу здесь узнать больше.Почему cout.setf (ios :: fixed) меняет мои поплавки на шестнадцатеричные?

Проблема в том, что все числа с плавающей точкой были напечатаны как шестнадцатеричные числа при использовании cout.setf (ios :: fixed). Почему это происходит? Документация ios :: base не означает, что это произойдет (по крайней мере, для меня). Я использую g ++ 5.3.0 и вставляемый ниже - это минимальный пример и вывод.

#include <iostream> 
    #include <complex> 

    using namespace std; 

    int main(int argc, char const *argv[]) 
    { 
    complex<double> I(0.0, 1.0); 
    double pi = M_PI; 

    cout.setf(ios::scientific); 
    cout<<" I is "<<I<<endl; 
    cout<<" Exp(I Pi) "<<exp(I*pi)<<endl; 
    cout<<" Cos(Pi) "<<cos(pi)<<endl<<endl; 

    cout.setf(ios::fixed); 
    cout<<" I is "<<I<<endl; 
    cout<<" Exp(I Pi) "<<exp(I*pi)<<endl; 
    cout<<" Cos(Pi) "<<cos(pi)<<endl<<endl; 

    return 0; 
    } 

Выход

I is (0.000000e+00,1.000000e+00) 
Exp(I Pi) (-1.000000e+00,1.224647e-16) 
Cos(Pi) -1.000000e+00 

I is (0x0p+0,0x1p+0) 
Exp(I Pi) (-0x1p+0,0x1.1a62633145c07p-53) 
Cos(Pi) -0x1p+0 

See the live sample here

Обратите внимание, что проблема уходит, когда я меняю

cout.setf(ios::fixed); 

в

cout.setf(ios::fixed, ios::floatfield); 

ответ

7

Потому что вы сказали это.

От setf documentation on cppreference.com:

научный - генерировать тип с плавающей точкой с использованием научной нотации, или шестигранное обозначения, если в сочетании с фиксированным: см std::scientific
фиксированной - генерировать тип с плавающей точкой с использованием фиксированного обозначения, или шестнадцатеричной нотации в сочетании с научными данными: см. std::fixed

Итак, при настройке std::fixed вам необходимо снять std::scientific (это то, что делает размагничивание std::floatfield, потому что std::floatfield - std::scientific|std::fixed|(std::scientific|std::fixed)|0), чтобы избежать шестнадцатеричной нотации.

+1

молнии удары снова: D, +1 хотя :) –

+0

Что для _reading_! –

+0

Спасибо! Смущающая ошибка. – vijayshankarv

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

  • Нет связанных вопросов^_^