Программирование на языке C. Точность значений с плавающей запятой

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



Значения типа float имеют около шести или семи значащих цифр (т.е. различаемых цифр после точки); значение типа double - 15 или 16, a long double - 19. Ошибка округления, вышедшая за пределы установленных значащих цифр, может привести к потере информации.

Концептуально существует бесконечное число значений между двумя числами. Между 2 и 3 находится значение 2.5; между 3 и 3.5 есть 3.25 и т.д. Однако, поскольку для представления значения с плавающей запятой используется ограниченное количество битов, некоторые значения не могут быть точно представлены в памяти. Значения с плавающей запятой в компьютере лишь аппроксимируют истинные вещественные числа в математике. Вы можете представить любое значение в пределах диапазона выбранного типа с плавающей запятой, но не можете представить каждое значение с абсолютной точностью.

Данный код демонстрирует особенности выражений с плавающей запятой.

#include <stdio.h>



main ()

{

double d4 = 4.0/2.0;

double d5 = 1.0/3.0;

double d6 = 2.0E40 * 2.0E30 + 1;



printf("d4 = %lfn", dl) ;

printf("d5 = %lfn", d2);

printf(“d6 = %len", d3);

return 0;

}

Строки 5-7 присваивают значения результатов трех выражений переменным типа double. Деление 4 на 2 дает результат 2.0, который может точно представлен. Однако при делении 1 на 3 получается нечто вроде 0.33333 - близко, но не точно. Десятичная цифра повторяется до бесконечности, и любое отсечение уменьшает общую точность. Третье выражение прибавляет 1 к произведению двух очень больших чисел.

Поскольку результат требует более 64 битов для его представления, полученное значение d3 (4Е+70) будет на 1 меньше, чем истинный ответ.

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

-Всюду, где только можно, объявляйте вместо 32-битовых переменных типа float 64-битовые переменные типа double. Тип double может безопасно представлять больше значащих цифр, чем float, и в большинстве случаев дает более точные результаты.

-Не используйте long double, если вы в самом деле не нуждаетесь в дополнительной точности, обеспечиваемой этим 80-битовым значением с плавающей запятой, которое требует больше памяти и времени на обработку. Для большинства приложений простые значения типа double позволяют достичь идеального компромисса между размером и точностью.

-Не используйте значения с плавающей запятой для хранения важных финансовых данных. Ошибки округления здесь неприемлемы. Для работы с финансовой и другой важной информацией существуют специальные классы чисел.

 

Популярные шаблоны