Завершите фрагмент кода, приведенный выше, и преобразуйте его в программу. Попробуйте ввести предлагаемые числа; затем введите числа
1234 1234 1234 1234
Объясните результат. Попробуйте ввести другие числа, чтобы увидеть, что произойдет.
Для того чтобы принять и правильно интерпретировать префиксы 0
и 0x
, можно использовать оператор >>
. Для этого необходимо отменить установки, принятые по умолчанию. Рассмотрим пример.
cin.unsetf(ios::dec); // не считать десятичным
// (т.е. 0x может означать
// шестнадцатеричное число)
cin.unsetf(ios::oct); // не считать восьмеричным
// (т.е. 12 может означать двенадцать)
cin.unsetf(ios::hex); // не считать шестнадцатеричным
// (т.е. 12 может означать двенадцать)
Функция-член потока unsetf()
сбрасывает флаг (или флаги), указанный как аргумент. Итак, если вы напишете
cin >>a >> b >> c >> d;
и введете
1234 0x4d2 02322 02322
то получите
1234 1234 1234 1234
11.2.3. Вывод чисел с плавающей точкой
Если вы непосредственно работаете с аппаратным обеспечением, то вам нужны шестнадцатеричные числа (и, возможно, восьмеричные). Аналогично, если вы проводите научные вычисления, то должны форматировать числа с плавающей точкой. Они обрабатываются манипуляторами потока iostream
почти так же, как и целые числа. Рассмотрим пример.
cout << 1234.56789 << "\t\t(общий)\n" // \t\t — выравнивание столбцов
<< fixed << 1234.56789 << "\t(фиксированный)\n"
<< scientific << 1234.56789 << "\t(научный)\n";
В итоге получим следующие строки:
1234.57 (общий)
1234.567890 (фиксированный)
1.234568e+003 (научный)
Манипуляторы fixed
и scientific
используются для выбора форматов для представления чисел с плавающей точкой. Интересно, что в стандартной библиотеке нет манипулятора general
, который устанавливал бы формат, принятый по умолчанию. Однако мы можем определить его сами, как это сделано в заголовочном файле std_lib_facilities.h
. Для этого не требуются знания о внутреннем устройстве библиотеки ввода-вывода.
inline ios_base& general(ios_base& b) // фиксированный и научный
// формат
// сбрасывает все флаги формата с плавающей точкой
{
b.setf(ios_base::fmtflags(0), ios_base::floatfield);
return b;
}
Теперь можем написать следующий код:
cout << 1234.56789 << '\t'
<< fixed << 1234.56789 << '\t'
<< scientific << 1234.56789 << '\n';
cout << 1234.56789 << '\n'; // действует формат
// с плавающей точкой
cout << general << 1234.56789 << '\t' // предупреждение:
<< fixed << 1234.56789 << '\t' // general — нестандартный
// манипулятор
<< scientific << 1234.56789 << '\n';
В итоге получим следующие числа:
1234.57 1234.567890 1.234568e+003
1.234568e+003 // манипулятор научного формата является
// персистентным
1234.57 1234.567890 1.234568e+003
Итак, существует несколько манипуляторов для работы с числами с плавающей точкой.
11.2.4. Точность
По умолчанию число с плавающей точкой выводится на печать с помощью шести цифр в формате general
. Формат, состоящий из шести цифр (точность формата general по умолчанию), считается наиболее подходящим, а такое округление числа — наилучшим. Рассмотрим пример.
1234.567
выводится на печать как 1234.57
1.2345678
выводится на печать как 1.23457
Округление, как правило, выполняется по правилу 4/5: от 0 до 4 — округление вниз, а от 5 до 9 — вверх. Обратите внимание на то, что такое форматирование относится только к числам с плавающей точкой.
1234567
выводится на печать как 1234567
(поскольку число целое)
1234567.0
выводится на печать как 1.23457e+006