Elementor Header #8

10. Числа с плавающей точкой

1. Введение

Числа с плавающей точкой — это тип данных, который используется для представления дробных чисел или чисел с десятичной частью. В C++ существует несколько типов данных для работы с числами с плавающей точкой, таких как float, double и long double. В этом уроке мы рассмотрим их особенности и использование.

2. Основные типы данных для чисел с плавающей точкой

В C++ существует три основных типа данных для представления чисел с плавающей точкой:

  1. float:

    • Обычно занимает 4 байта (32 бита) памяти.
    • Имеет точность примерно 7 значащих цифр.
    • Применяется для случаев, когда требуется экономия памяти, и точности double достаточно.
  2. double:

    • Обычно занимает 8 байт (64 бита) памяти.
    • Имеет точность примерно 15 значащих цифр.
    • Это наиболее часто используемый тип для чисел с плавающей точкой в C++.
  3. long double:

    • Обычно занимает 10, 12 или 16 байт (зависит от компилятора и платформы).
    • Имеет более высокую точность и диапазон, чем double.
    • Используется в случае, если требуется максимальная точность.

3. Объявление и инициализация чисел с плавающей точкой

Числа с плавающей точкой можно объявить и инициализировать так же, как и любые другие переменные:

				
					float a = 3.14f;      // Примечание: литерал 'f' указывает, что это float
double b = 3.14159;   // Литералы по умолчанию считаются типом double
long double c = 2.718281828459045L; // Литерал 'L' указывает на long double

				
			

4. Особенности работы с числами с плавающей точкой

Точность

Одна из ключевых особенностей чисел с плавающей точкой — это их ограниченная точность. Из-за этого они могут хранить значения с округлением. Например:

				
					double x = 0.1 + 0.2;
std::cout << x << std::endl; // Результат может быть не точно 0.3, а что-то вроде 0.30000000000000004

				
			

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

Диапазон значений

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

				
					double large = 1.7e308; // Очень большое число
double small = 5.0e-324; // Очень маленькое число

				
			

Научная запись

Для записи чисел с плавающей точкой часто используется научная нотация:

				
					double scientific = 1.23e4; // Это 1.23 * 10^4, что равно 12300

				
			

5. Арифметические операции с числами с плавающей точкой

Вы можете использовать стандартные арифметические операторы (+, -, *, /) с числами с плавающей точкой, так же как и с целыми числами:

				
					float a = 5.5f;
float b = 2.2f;
float sum = a + b; // Сложение
float difference = a - b; // Вычитание
float product = a * b; // Умножение
float quotient = a / b; // Деление

				
			

6. Ограничения и ошибки при работе с числами с плавающей точкой

1. Проблема точности:

Как было упомянуто ранее, числа с плавающей точкой имеют ограниченную точность. Это может привести к ошибкам при сравнении значений:

				
					double x = 0.1 + 0.2;
if (x == 0.3) {
    std::cout << "Равно 0.3" << std::endl;
} else {
    std::cout << "Не равно 0.3" << std::endl; // Скорее всего, результат будет "Не равно 0.3"
}

				
			

Решение: для сравнения чисел с плавающей точкой рекомендуется использовать определенный порог (epsilon):

				
					double epsilon = 1e-9;
if (std::abs(x - 0.3) < epsilon) {
    std::cout << "Равно 0.3" << std::endl;
} else {
    std::cout << "Не равно 0.3" << std::endl;
}

				
			

2. Переполнение и потеря точности:

При работе с очень большими или очень маленькими числами можно столкнуться с переполнением (overflow) или потерей точности (underflow). Это может привести к неожиданным результатам.

3. Округление:

Операции с числами с плавающей точкой могут приводить к неожиданному округлению. Например:

				
					double x = 1.0 / 3.0;
std::cout << x << std::endl; // Результат будет приближенно равен 0.333333, но не точен

				
			

Заключение

Числа с плавающей точкой — это важный тип данных в C++, используемый для работы с дробными числами и числами с большой или маленькой величиной. Однако при работе с ними необходимо учитывать возможные ошибки точности, переполнения и округления. Понимание этих особенностей поможет вам избежать ошибок и писать более надежные программы.

7. Тестовое задание

Напишите программу на C++, которая выполняет следующие действия:

  1. Подключите необходимые библиотеки.
  2. Объявите переменные типа float, double, long double.
  3. Выполните и выведите результаты различных арифметических операций с этими переменными.
  4. Продемонстрируйте использование научной нотации.
  5. Попробуйте выполнить сравнение чисел с плавающей точкой, используя порог (epsilon).

Примерный код может выглядеть так:

				
					#include <iostream>
#include <cmath> // Для функции std::abs

int main() {
    float a = 1.0f / 3.0f;
    double b = 1.0 / 3.0;
    long double c = 1.0L / 3.0L;

    std::cout << "float: " << a << std::endl;
    std::cout << "double: " << b << std::endl;
    std::cout << "long double: " << c << std::endl;

    double x = 0.1 + 0.2;
    double epsilon = 1e-9;

    if (std::abs(x - 0.3) < epsilon) {
        std::cout << "x равно 0.3" << std::endl;
    } else {
        std::cout << "x не равно 0.3" << std::endl;
    }

    return 0;
}

				
			

Попробуйте написать и запустить этот код, чтобы убедиться в правильности выполнения операций и особенностях работы с числами с плавающей точкой.

logo