Особенности применения чисел с плавающей точкой
Особенности применения чисел с плавающей точкой.
Тема чисел с плавающей точкой достаточна сложна. Исходя из принципа: польза — вред, суть представления чисел с плавающей точкой будет опущена и речь в лекции пойдет об особенностях применения таких чисел. Автор считает, что на начальном этапе обучения, знания об операциях чисел с плавающей точкой на аппаратном уровне, не принесут практической пользы.
Число с плавающей точкой есть ни что иное как число с дробной частью, которое состоит из двух частей — целой и дробной. В десятичном виде, в русских текстах целая и дробная часть отделены друг от друга запятой, но при написании программного кода, в зависимости от настроек на вашем компьютере, в качестве запятой может быть использована точка. Точка между целой и дробной частью определило название — число с плавающей точкой.
Для хранения значений с плавающей точкой, используются нижеприведенные типы данных.
Типы с плавающей запятой (float, double)
float: хранит число с плавающей точкой от -1.5*10-45 до 3.4*1038 и занимает 4 байта. Формат значения для float — в конце операнда-значения указывается суффикс « f »
double: хранит число с плавающей точкой от ±5.0*10-324 до ±1.7*10308 и занимает 8 байта. Формат для double — операнд-значение записывается с указанием дробной части, если дробная часть равно нулю, то указывается ноль.
Отдельно стоит тип данных —decimal, который хранит число с плавающей точкой от ±1.0*10-28 до ±7.9*1028 и занимает 16 байта. Формат для decimal — в конце операнда-значения указывается суффикс «M». Операции с типом данных рассмотрены не будут.
Типы данных для вещественных чисел, так же, как и для целых относятся к примитивным типам данных, хранятся в стеке и обладают теми же особенностями применения, что и целочисленные значения. Использование float, за счет небольшого размера, позволяет эффективно использовать аппаратные ресурсы вычислительной системы в ущерб точности, double позволяет достичь более высокой точности, но занимает 8 байт.
Помимо особенностей применения, перенятых от целочисленных типов, у типов для значений с плавающей точкой есть особенности, которые при применении на практике требуют пристального внимания.
Так как, особенностей операций над числами с плавающей точкой достаточно много, а описательный процесс таких операций, из-за особенностей хранения таких значений, достаточно велик даже для одной операции, такие особенности будут рассмотрены на практических примерах.
Пример 1. Формат значения
Напишем программу деления целочисленного числа 10 на целочисленное число 6.
static void Main(string[] args)
{
double variable = 10/6;
Console.WriteLine("Десять разделить на шесть = " + variable);
}
Несмотря на то, что в памяти компьютера было выделено место для записи значения с плавающей точкой, в переменную variable было записана только целая часть полученного результата. Объяснение этому кроется в формате полученного результата от операции деления целого числа на целое. Результатом такой операции всегда будет значение с автоматически присвоенным типом данных int, который не предназначен для хранения значения с дробной частью, поэтому дробная часть была отброшена, и в переменную с типом данных double, именем variable, была записана только целая часть.
Для получения правильного результата, одно или оба значения указываются в соответствующем формате, к примеру для типа данных double после целой части указывается дробная часть числа.
static void Main(string[] args)
{
double variable = 10 / 6.0;
Console.WriteLine("Десять разделить на шесть = " + variable);
}
Пример 2. Округление
Не всегда есть необходимость большой точности. Так, результату финансовых вычислений вполне удовлетворит точность с двумя знаками после запятой. Для округления используется метод Round(), в круглые скобки которого помещается имя переменной, а через запятую указывается количество знаков после запятой. Для хранения результата округления используется тип данных — double. В отличии от метода WriteLine(), который принадлежит классу Console, метод Round() принадлежит классу Math, поэтому для вызова метода, используется конструкция Math.Round().
static void Main(string[] args)
{
float weight = 1.3f;
float price = 5.22f;
double total = Math.Round(weight * price, 2);
Console.WriteLine("Сумма = " + total);
}
В случае если точность не будет указана, значение будет округлено до целой части. Целую часть числа с плавающей точкой можно так же получить явным привидением типов.
3. Операции над переменными
Нижеприведенный код демонстрирует разницу в результатах после операций над переменными. Да, разница небольшая, но при сравнении этих значений логика программы будет нарушена, что приведет к ошибке в дальнейших вычислениях.
static void Main(string[] args)
{
float a = 1.2f;
float b = 1.2f;
float sumFloat = a + b;
double sumDouble = a + b;
Console.WriteLine("sumFloat = " + sumFloat);
Console.WriteLine("sumDouble = " + sumDouble);
}
5. Ограничение по размеру выделяемой области памяти
При операциях над числами с плавающей точкой необходимо помнить, что дробная часть сокращается в угоду целой части. Если вы хотите использовать число Pi для точных расчетов, используйте тип данных double.
static void Main(string[] args)
{
float floatPi = 3.14159265358980f;
double doublePi = 3.14159265358980;
Console.WriteLine("Тип данных float = " + floatPi);
Console.WriteLine("Тип данных double = " + doublePi);
}
В заключение.
Числа с плавающей точкой хранятся в стеке и относятся к примитивным типам данных. Из-за особенностей хранения чисел с плавающей точкой, применение на практике таких чисел довольно часто преподносят неожиданные результата. Большая часть ошибок приходится на использование не идентичных типов данных. Возьмите за правило перепроверять каждый результат таких операций.
На этом занятие закончено.
Вы можете самостоятельно найти задачи для закрепления теоретического материала или для получения задач с ответами отправьте письмо на basicprog@mail.ru
Удачи в выполнении практических заданий!