(C++) Вещественные числа


Вещественные числа

float f = 6.5;
double r = 5.0;

Значение 5.0 - число, представленное в виде десятичной дроби (имеет целую и дробную часть). В информатике такие числа называются вещественными.
 
Вещественное число - это число, в котором есть целая и дробная части. Целая и дробная части отделяются друг от друга точкой, а не запятой как в математике.

Даже если дробная часть числа равна нулю, как в переменной r в примере, все равно транслятор создаст в памяти вещественную переменную. Точка, как бы сигнал для транслятора, что необходимо создать именно вещественную переменную. 

Очень большие и очень маленькие числа  записываются с помощью "плавающей точки" (в так называемом научном формате).  
В научном формате число представляется в виде мантиссы (значащей части числа) и порядка. При записи мантисса и порядок отделяются друг от друга буквой e (обозначает 10 в какой-то степени). 
Например, можно сохранить в переменной значение заряда электрона 
\(1,60217662 \times 10^{-19}\) Кл), записав в следующем виде 
double El = 1.60217662e-19 
   // для положительного порядка знак + можно не записывать

Практически все вещественные числа не могут храниться в памяти компьютера с идеальной точностью, так как под их хранение выделяется ограниченное число бит. Поэтому при вычислениях с вещественными числами ошибки, связанные с неточностью представления накапливаются. Причем, чем меньше места выделено, тем больше будет эта ошибка. Для того, чтобы уменьшить ошибку в С++ используют тип double, который хранит в памяти вещественное число с двойной точностью (занимает в памяти восемь байт, в то время как тип float- 4 байта).

Для получения болшей точности вычислений используйте в программе тип double.

Ввод вещественных чисел

Ввести несколько вещественных переменных из входного потока и записать их в переменные можно стандартным способом:
double x, y;
cin >> x >> y;
Первое число попадает в переменную x, второе - в y.


Вывод вещественных чисел

По умолчанию cout в C++ выводит 6 знаков после запятой для вещественных чисел. Это означает, что если не указано иное, то вещественное число будет выведено с точностью до 6 знаков. Если в числе меньше цифр после запятой, то недостающие знаки будут заменены нулями. Если же число содержит больше цифр после запятой, то оно будет округлено до 6 знаков.

Если не указать явно точность вывода с помощью функции setprecision или используя флаг fixed, то число будет выведено с этой точностью. Например, число 81220.545 округляется до 81220.5, т.к. последний знак "5" в пятом десятичной разряде (6-я цифра).

Формат вывода можно настроить. Для этого используется дополнительная библиотека iomanip - манипуляторы, управляющие выводом.
Для вывода в формате с фиксированной точкой используется манипулятор fixed, для научного формата - scientific. Затем необходимо определить количество цифр в дробной части с помощью манипулятора setprecision(). С помощью манипулятора setw() можно задать общее число позиций, отводимых на вывод числа.
 
Пример
#include<iomanip>
...

double x = 1.0/6;
// установили вывести 9 цифр в дробной части
cout << fixed << setprecision (9);  
cout << setw(12) << x << endl;                            

Фрагмент программы выведет
_0.166666672                  

Все команды можно записать и в одну строчку:
cout << fixed << setprecision(9) << setw(12) << x << endl;


При выводе значений вещественных чисел можно использовать только fixed без setprecision в cout. Это позволит вывести вещественное число с фиксированной точкой, используя стандартное значение точности, которое по умолчанию равно 6.

cout << fixed << x << endl;

Операции с вещественными числами. Модуль cmath

При работе с вещественными числами можно использовать уже знакомый нам модуль сmath, который содержит большое число встроенных функций. 
При решении задач часто приходится округлять вещественные числа до ближайших целых значений. Для этого имеются две функции.
 
Надо запомнить!
1. при явном преобразовании типа ( double x=1.5; int y = int(x))  -  дробную часть вещественного числа отсекается (y = 1); 
2. функция floor(x) -  возвращает наибольшее целое, меньшее или равное x (округление "вниз");
3. функция ceil(x) -  возвращает наименьшее целое, большее или равное x (округление "вверх").

Приведем наиболее полезные функции, содержащиеся в модуле cmath.
Функция Описание
Округление
round(x)
C++ 11
Округляет число до ближайшего целого. Если дробная часть числа равна 0.5, то число округляется до ближайшего целого числа. 
trunc(x)
C++ 11
Отбрасывает дробную часть
floor(x) Округляет число вниз («пол»), при этом floor(1.5) == 1floor(-1.5) == -2
ceil(x) Округляет число вверх («потолок»), при этом ceil(1.5) == 2ceil(-1.5) == -1
abs(x) Модуль (абсолютная величина).
fabs(x) Модуль вещественного числа
Корни, логарифмы
sqrt(x) Квадратный корень. Использование: y = sqrt(x)
pow(x, y) Возводит x в степень y. \(x^y\)
log(x) Натуральный логарифм. 
exp(x) Основание натуральных логарифмов e = 2,71828...
Тригонометрия
sin(x) Синус угла, задаваемого в радианах
cos(x) Косинус угла, задаваемого в радианах
tan(x) Тангенс угла, задаваемого в радианах
asin(x) Арксинус, возвращает значение в радианах
acos(x) Арккосинус, возвращает значение в радианах
atan(x) Арктангенс, возвращает значение в радианах
atan2(y, x) Полярный угол (в радианах) точки с координатами (x, y).
M_PI Константа, хранящая значение числа Пи. Для использования необходимо вначале программы прописать строчку 
#define _USE_MATH_DEFINES