Плавающая точка в .NET - часть 1: принципы и форматы - Некоторая терминология

ОГЛАВЛЕНИЕ


Некоторая терминология

Перед тем, как мы что-либо сделаем, мы должны определить термины, которые свойствены численным методам.

Представление чисел

Компьютерная программа - это модель чего-то в реальном мире. Множество вещей в реальном мире представлено числами. Эти числа должны также быть представлены в компьютерных программах. Отсюда и были введены численные форматы.

Со стороны программиста, числовой формат - это набор чисел. В 99.9% случаев двоичное или внутреннее представление не настолько важно. Это может быть важным в том случае, если у нас битовые поля, но это нас не очень волнует. Что важно, так это то, что так можно представить числа из реального мира, который мы моделируем. Некоторые числовые форматы включают в себя специальные значения, которые обозначают неверные значения или те значения, которые находятся за пределами данного числового формата.

Целые числа

Большинство чисел являются целыми и их легко представить. Практически любое целое число, которое вы встретите может быть представлено "32-битным целым числом со знаком", что является числом в пределах от -2,147,483,648 до 2,147,483,647. Для некоторых приложений, таких, которые подсчитывают количество людей к примеру, вам понадобится более широкий формат - 64-битный тип целых чисел. Его область настолько широка, что можно подсчитать каждую десятую доли микросекунды за несколько тысячелетий. (Таким образом представлено значение DateTime.)

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

Числа с фиксированной запятой

Число с фиксированной точкой формируется путем умножения целого числа (мантисса) на какой-нибудь небольшой масштабный множитель, зачастую это отрицательная степень 10 или 2. Название получено исходя из того факта, что десятичная точка находится в фиксированной позиции при выводе числа. Примером формата фиксированной точки будет тип Currency в .NET Visual Basic и тип Money в SQL Server. Данные типы имеют область равную +/-900 биллонам и четыре цифры за десятичной точкой. Множитель равен 0.0001 и каждое умножение 0.0001 в пределах указанной области представлено таким форматом. Другим примером будет NTP-протокол (Network Time Protocol), где смещение времени возвращено в виде 32- и 64- битовых значений с фиксированной точкой, при этом 'двоичная' точка расположена в 16-ом и 32-ом битах соответственно.

Фиксированная точка пригодна для многих приложений. Для финансовых подсчетов это предоставило возможность представления таких чисел как 0.1 и 0.01 точно с верным множителем. Тем не менее, это не пригодно для многих приложений, где необходим более широкий ряд чисел. В физике микрочастиц часто используются числа меньшие чем 10-20, а специалисты по космологии оценивают число частиц в наблюдаемой вселенной примерно равное 1085. Непрактично представлять такие числа в виде формата с фиксированной точкой. Для того чтобы покрыть всю область, одно число должно занимать как минимум 50 байт!

Числа с плавающей запятой

Данная проблема была решена с введением чисел с плавающей точкой. Числа с плавающей точкой имеют фактор переменной масштаба, который указывается в качестве экспоненты степени небольшого числа, называемой базой, которая зачастую равна 2 или 10. .NET Framework определяет три типа плавающей точки: Single (одинарный), Double (двойной) и Decimal (десятичный). Все верно - десятичный тип (Decimal) не использует формат фиксированной точки, как Currency и Money. Он использует десятичный формат с плавающей точкой.

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

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