Чтение онлайн

ЖАНРЫ

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

и введете

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

В последнем случае поток

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

Точность определятся по правилам, приведенным ниже.

Поделиться с друзьями: