Программирование. Принципы и практика использования C++ Исправленное издание - Бьёрн Страуструп
Книгу Программирование. Принципы и практика использования C++ Исправленное издание - Бьёрн Страуструп читаем онлайн бесплатно полную версию! Чтобы начать читать не надо регистрации. Напомним, что читать онлайн вы можете не только на компьютере, но и на андроид (Android), iPhone и iPad. Приятного чтения!
Шрифт:
Интервал:
Закладка:
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 << "tt(общий)n" // tt — выравнивание столбцов
<< 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
В последнем случае поток ostream распознает, что число 1234567.0 нельзя вывести на печать в формате fixed, используя только шесть цифр, и переключается на формат scientific, чтобы обеспечить как можно более точное представление числа. В принципе формат general может автоматически заменяться форматами scientific и fixed, чтобы обеспечить максимально точное представление числа с плавающей точкой в рамках общего формата, предусматривающего использование шести цифр.
ПОПРОБУЙТЕ
Напишите программу, три раза выводящую на печать число 1234567.89, сначала в формате general, затем — в fixed, потом — в scientific. Какая форма вывода обеспечивает наиболее точное представление числа и почему?
Программист может установить точность представления числа, используя манипулятор setprecision(). Рассмотрим пример.
cout << 1234.56789 << 't'
<< fixed << 1234.56789 << 't'
<< scientific << 1234.56789 << 'n';
cout << general << setprecision(5)
<< 1234.56789 << 't'
<< fixed << 1234.56789 << 't'
<< scientific << 1234.56789 << 'n';
cout << general << setprecision(8)
<< 1234.56789 << 't'
<< fixed << 1234.56789 << 't'
<< scientific << 1234.56789 << 'n';
Этот код выводит на печать следующие числа (обратите внимание на округление):
1234.57 1234.567890 1.234568e+003
1234.6 1234.56789 1.23457e+003
1234.5679 1234.56789000 1.23456789e+003
Точность определятся по правилам, приведенным ниже.
Мы рекомендуем использовать формат, принятый по умолчанию (формат general с точностью, равной шести цифрам), если у вас нет весомых причин для применения другого формата. Обычно причина, по которой выбираются другие форматы, такова: “Мы хотим получить большую точность при выводе”.
11.2.5. Поля
С помощью научного и фиксированного формата программист может точно контролировать, сколько места займет число на выходе. Это очень полезно при распечатке таблиц и т.п. Эквивалентный механизм для целых чисел называют полями (fields). Вы можете точно указать ширину поля, используя манипулятор setw(). Рассмотрим пример.
cout << 123456 // поля не используются
<<'|'<< setw(4) << 123456 << '|' // число 123456
// не помещается в поле
<< setw(8) << 123456 << '|' // из 4 символов,
// расширим до 8
<< 123456 << "|n"; // размеры полей не инертны
В итоге получим следующий результат:
123456|123456| 123456|123456|
Обратите внимание на два пробела перед третьим появлением числа 123456. Это является результатом того, что мы выводим шесть цифр в поле, состоящее из восьми символов. Однако число 123456 невозможно усечь так, чтобы оно помещалось в поле, состоящем из четырех символов. Почему? Конечно, числа |1234| или |3456| можно интерпретировать как вполне допустимые для поля, состоящего из четырех символов. Однако в этом случае на печать будут выведены числа, которые совершенно не соответствуют ожиданиям программиста, причем он не получит об этом никакого предупреждения. Поток ostream не сделает этого; вместо этого он аннулирует неправильный формат вывода. Плохое форматирование почти всегда лучше, чем “плохие результаты”.
Прочитали книгу? Предлагаем вам поделится своим отзывом от прочитанного(прослушанного)! Ваш отзыв будет полезен читателям, которые еще только собираются познакомиться с произведением.
Уважаемые читатели, слушатели и просто посетители нашей библиотеки! Просим Вас придерживаться определенных правил при комментировании литературных произведений.
- 1. Просьба отказаться от дискриминационных высказываний. Мы защищаем право наших читателей свободно выражать свою точку зрения. Вместе с тем мы не терпим агрессии. На сайте запрещено оставлять комментарий, который содержит унизительные высказывания или призывы к насилию по отношению к отдельным лицам или группам людей на основании их расы, этнического происхождения, вероисповедания, недееспособности, пола, возраста, статуса ветерана, касты или сексуальной ориентации.
- 2. Просьба отказаться от оскорблений, угроз и запугиваний.
- 3. Просьба отказаться от нецензурной лексики.
- 4. Просьба вести себя максимально корректно как по отношению к авторам, так и по отношению к другим читателям и их комментариям.
Надеемся на Ваше понимание и благоразумие. С уважением, администратор knigkindom.ru.
Оставить комментарий
-
Гость Юлия11 ноябрь 09:30
О, роман что надо! ...
Не отпускай моей руки - Люси Эллис
-
Гость Юлия10 ноябрь 17:15
Вот роман то, что надо!)...
Продлить наше счастье - Мелани Милберн
-
машаМ10 ноябрь 14:55
Замечательный роман!...
Плач в ночи - Мэри Хиггинс Кларк
