По умолчанию шестнадцатеричные значения выводятся в нижнем регистре с x
, также в нижним регистре. Манипулятор uppercase
позволяет отобразить X
и шестнадцатеричные цифры a-f
в верхнем регистре:
cout << uppercase << showbase << hex
<< "printed in hexadecimal: " << 20 << " " << 1024
<< nouppercase << noshowbase << dec << endl;
Этот оператор создает следующий вывод:
printed in hexadecimal: 0X14 0X400
Манипуляторы nouppercase
, noshowbase
и dec
применяются для возвращения потока в исходное состояние.
Контролировать можно три аспекта вывода числа с плавающей запятой.
• Количество выводимых цифр точности.
• Выводится ли число в шестнадцатеричном формате, как фиксированное десятичное число или в экспоненциальном представлении.
• Выводится ли десятичная точка для целочисленных значений с плавающей запятой.
По умолчанию значения с плавающей запятой выводятся с шестью цифрами точности; десятичная точка не отображается при отсутствии дробной части; в зависимости от величины значения используется фиксированный десятичный формат или экспоненциальная форма. Библиотека выбирает формат, увеличивающий удобочитаемость числа. Очень большие и очень маленькие значения выводятся в экспоненциальном представлении. Другие значения выводятся в фиксированном десятичном формате.
По умолчанию точность контролирует общее количество отображаемых цифр. При выводе значение с плавающей запятой округляется (а не усекается) до текущей точности. Таким образом, если текущая точность четыре, то число 3.14159
становится 3.142
; если точность три, то оно выводится как 3.14
.
Для изменения точности можно воспользоваться функцией-членом precision()
объекта ввода-вывода или манипулятором setprecision
. Функция-член precision()
перегружена (см. раздел 6.4). Одна ее версия получает значение типа int и устанавливает точность в это новое значение. Она возвращает setprecision
получает аргумент, который и использует для установки точности.
setprecision
и другие манипуляторы, получающие аргументы, определяются в заголовке iomanip
.
Следующая программа иллюстрирует различные способы контроля точности при выводе значения с плавающей точкой:
//
cout << "Precision: " << cout.precision()
<< ", Value: " << sqrt(2.0) << endl;
//
cout.precision(12);
cout << "Precision: " << cout.precision()
<< ", Value: " << sqrt(2.0) << endl;
//
//
setprecision cout << setprecision(3);
cout << "Precision: " << cout.precision()
<< ", Value: " << sqrt(2.0) << endl;
Эта программа выводит следующее:
Precision: 6, Value: 1.41421
Precision: 12, Value: 1.41421356237
Precision: 3, Value: 1.41
Программа использует библиотечную функцию sqrt()
, определенную в заголовке cmath
. Функция sqrt()
перегружена и может быть вызвана с аргументами типа float
, double
или long double
. Она возвращает квадратный корень своего аргумента.
Используя соответствующий манипулятор, можно заставить поток использовать научную, фиксированную или шестнадцатеричную форму записи. Манипулятор scientific
задает использование экспоненциального представления. Манипулятор fixed
задает использование фиксированных десятичных чисел.
hexfloat
. Новая библиотека предоставляет еще один манипулятор, defaultfloat
. Он возвращает поток в стандартное состояние, при котором выбор формы записи осуществляется на основании выводимого значения.