(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.

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

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


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

Для вывода данных на экран (консоль) используется cout.  Оператор << позволяет направлять данные в стандартный поток вывода cout (обычно на консоль). Оператор << определен (перегружен) для работы с разными типами данных. 

По умолчанию, при выводе вещественных чисел с помощью cout, используются правила округления, определенные стандартом языка C++. Обычно используется округление до ближайшего значащего разряда (round-to-nearest). Если десятичная часть числа находится на середине между двумя возможными округлениями, то округление происходит к четному значению (так называемое "банковское округление"). Например:

#include <iostream>

using namespace std;

int main()
{
    cout << 3.123445 << endl;   # выведет 3.12344 (endl - переводит курсор на новую строку)
    cout << 3.14159 << endl;    # выведет 3.14159
    cout << 123457.5 << endl;   # выведет 123458
    cout << 12345678.9 << endl;       # выведет 1.23457e+07
    cout << 0.000000123456 << endl;   # выведет 1.23456e-07
    return 0;
}

Вещественное числа могут быть выведены как числа с фиксированной точностью (первые три числа из примера выше) и как число с плавающей точкой (четвертое и пятое числа из примера). 
Если в записи числа много цифр, то cout выводит только 6 цифр. Если число очень большое (больше 6 цифр в целой части) или очень маленькое (как пятое число из примера), то оно будет выведено в формате с плавающей точкой (в научном формате).

Форматом вывода вещественных чисел можно манипулировать, используя различные манипуляторы. Используя различные комбинации манипуляторов и функций форматирования, можно настроить вывод вещественных чисел в C++ в соответствии с нужными требованиями. Чтобы работать с манипуляторами необходимо подключить библиотеку iomanip.

Наиболее часто используемые манипуляторы вывода: 
1. fixed: Этот манипулятор выводит числа с фиксированной точностью после десятичной точки (выводит по умолчанию 6 знаков после запятой).

double number = 3.1415987;
cout << fixed << number << endl;   # 3.141599

2. scientific: Этот манипулятор выводит числа в экспоненциальной форме (научном формате, формате с плавающей точкой).
double number = 1234.56789; 
cout << scientific << number << endl;   # 1.234568e+03

3. setprecision(n): Этот манипулятор устанавливает точность вывода чисел на n знаков после десятичной точки. 
double number = 3.14159; 
cout << fixed << setprecision(2) << number << endl;   # 3.14

4. setw(n) и left: Эти манипуляторы позволяют установить ширину поля вывода и выравнивание (в данном случае, влево). 
double number = 123.456; 
cout << setw(10) << left << number << endl;   # 123.456___
 
Пример
#include <iomanip> ... 
double x = 1.0/6;       
cout << fixed << setprecision (9); 
cout << setw(12) << x << endl;
Фрагмент программы выведет _0.166666672

Все команды можно записать и в одну строчку:
cout << fixed << setprecision(9) << setw(12) << 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

Пропустить Навигационные Ссылки.
Чтобы оставить комментарий нужна авторизация