Читаем Программирование полностью

В последнем случае поток 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 с точностью, равной шести цифрам), если у вас нет весомых причин для применения другого формата. Обычно причина, по которой выбираются другие форматы, такова: “Мы хотим получить большую точность при выводе”. 

<p id="AutBody_Root199"><strong>11.2.5. Поля</strong></p>

С помощью научного и фиксированного формата программист может точно контролировать, сколько места займет число на выходе. Это очень полезно при распечатке таблиц и т.п. Эквивалентный механизм для целых чисел называют полями (fields). Вы можете точно указать ширину поля, используя манипулятор setw(). Рассмотрим пример.

cout << 123456           // поля не используются

     <<'|'<< setw(4) << 123456 << '|' // число 123456

                         // не помещается в поле

     << setw(8) << 123456 << '|' // из 4 символов,

                         // расширим до 8

     << 123456 << "|\n"; // размеры полей не инертны

В итоге получим следующий результат:

123456|123456| 123456|123456|

  Обратите внимание на два пробела перед третьим появлением числа 123456. Это является результатом того, что мы выводим шесть цифр в поле, состоящее из восьми символов. Однако число 123456 невозможно усечь так, чтобы оно помещалось в поле, состоящем из четырех символов. Почему? Конечно, числа |1234| или |3456| можно интерпретировать как вполне допустимые для поля, состоящего из четырех символов. Однако в этом случае на печать будут выведены числа, которые совершенно не соответствуют ожиданиям программиста, причем он не получит об этом никакого предупреждения. Поток ostream не сделает этого; вместо этого он аннулирует неправильный формат вывода. Плохое форматирование почти всегда лучше, чем “плохие результаты”. В большинстве случаев (например, при выводе таблиц) переполнение полей сразу бросается в глаза и может быть исправлено.

Поля также можно использовать при выводе строк и чисел с плавающей точкой. Рассмотрим пример.

cout << 12345 <<'|'<< setw(4) << 12345 << '|'

     << setw(8) << 12345 << '|' << 12345 << "|\n";

cout << 1234.5 <<'|'<< setw(4) << 1234.5 << '|'

     << setw(8) << 1234.5 << '|' << 1234.5 << "|\n";

cout << "asdfg" <<'|'<< setw(4) << "asdfg" << '|'

     << setw(8) << "asdfg" << '|' << "asdfg" << "|\n";

Этот код выводит на печать следующие числа:

12345|12345| 12345|12345|

1234.5|1234.5| 1234.5|1234.5|

asdfg|asdfg| asdfg|asdfg|

Перейти на страницу:
Нет соединения с сервером, попробуйте зайти чуть позже