Kniga-Online.club
» » » » Программирование. Принципы и практика использования C++ Исправленное издание - Бьёрн Страуструп

Программирование. Принципы и практика использования C++ Исправленное издание - Бьёрн Страуструп

Читать бесплатно Программирование. Принципы и практика использования C++ Исправленное издание - Бьёрн Страуструп. Жанр: Программирование год 2004. Так же читаем полные версии (весь текст) онлайн без регистрации и SMS на сайте kniga-online.club или прочесть краткое содержание, предисловие (аннотацию), описание и ознакомиться с отзывами (комментариями) о произведении.
Перейти на страницу:
class="code">                      // шестнадцатеричное число)

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 не сделает этого; вместо этого он аннулирует неправильный формат вывода. Плохое форматирование почти всегда лучше, чем “плохие результаты”.
Перейти на страницу:

Бьёрн Страуструп читать все книги автора по порядку

Бьёрн Страуструп - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки kniga-online.club.


Программирование. Принципы и практика использования C++ Исправленное издание отзывы

Отзывы читателей о книге Программирование. Принципы и практика использования C++ Исправленное издание, автор: Бьёрн Страуструп. Читайте комментарии и мнения людей о произведении.


Уважаемые читатели и просто посетители нашей библиотеки! Просим Вас придерживаться определенных правил при комментировании литературных произведений.

  • 1. Просьба отказаться от дискриминационных высказываний. Мы защищаем право наших читателей свободно выражать свою точку зрения. Вместе с тем мы не терпим агрессии. На сайте запрещено оставлять комментарий, который содержит унизительные высказывания или призывы к насилию по отношению к отдельным лицам или группам людей на основании их расы, этнического происхождения, вероисповедания, недееспособности, пола, возраста, статуса ветерана, касты или сексуальной ориентации.
  • 2. Просьба отказаться от оскорблений, угроз и запугиваний.
  • 3. Просьба отказаться от нецензурной лексики.
  • 4. Просьба вести себя максимально корректно как по отношению к авторам, так и по отношению к другим читателям и их комментариям.

Надеемся на Ваше понимание и благоразумие. С уважением, администратор kniga-online.


Прокомментировать
Подтвердите что вы не робот:*
Подтвердите что вы не робот:*