Ранее я рассказывал о неприятностях, связанных с округлением чисел. Этих неприятностей можно избежать, если использовать вещественные числа, то есть числа с плавающей точкой. Однако и у таких чисел есть особенности, которые ограничивают их применение. Об этих особенностях сегодня и расскажу.
Итак, по сравнению с целыми числами, числа с плавающей точкой имеют следующие недостатки…
Перечисление
В перечислениях нельзя использовать вещественные числа. Потому что любое перечисление - это какой-то упорядоченный набор данных. А порядок (очерёдность) можно однозначно задать только с помощью порядковых типов. В большинстве случаев к таким типам относятся целые числа.
Например, понятно, что 1.0 - это 1. Но что такое 0.999 или 1.001 - можно ли эти числа считать единицей? Чтобы не заморачиваться подобными вопросами, во всех языках программирования (ну во всяком случае в тех, которые мне известны) вещественные числа нельзя использовать в перечислениях.
Также вы не можете использовать их в циклах for, в конструкциях case и в других подобных случаях. И даже в условных операторах if вещественные числа надо использовать с осторожностью (подробнее об этом как-нибудь в другой раз).
Скорость вычислений
На современных компьютерах это не так актуально. Однако не стоит забывать и про скорость вычислений. Несмотря на то, что современные процессоры имеют специальные команды для ускорения работы с вещественными числами, вычисления выражений с целыми числами всё равно выполняются быстрее. Особенно это заметно, если речь идёт о работе с большими объёмами данных.
Поэтому хорошей привычкой будет никогда не использовать числа с плавающей точкой, если в этом нет крайней необходимости.
Потеря точности
Точность чисел с плавающей точкой обычно ограничена шестью значащими разрядами после точки. В числах с двойной точностью - 15 разрядами. И хотя в подавляющем большинстве случаев этой точности более чем достаточно, это всё-таки ограничение. И это ограничение при сложных математических расчётах может вносить ощутимые погрешности (я в этом не раз убеждался лично).
К тому же компиляторы и языки программирования часто сами принимают неоднозначные решения и могут, например, вместо 0.999999 вывести на экран 1.
Ограничение диапазона
Например, тип double в С++ может хранить число с 308 нулями. Казалось бы - куда ещё больше. Однако с учётом особенностей хранения вещественных чисел в памяти компьютера и прочих неприятностей С++ учитывает лишь первые 13 знаков после запятой. Остальные падают жертвами ошибочных округлений. Да и упомянутые 13 знаков тоже не являются безупречно точными. При большом количестве вычислений погрешность накапливается и в итоге точность может упасть до 3…4 знаков.
С целыми же числами всё проще. И хотя число нулей в целых типах данных обычно не более 9, зато точность вычислений будет безупречна. Если, конечно, вы не выйдете из диапазона.
Ну что же, на этом всё. Подписывайтесь на канал, чтобы не пропустить новые статьи…