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

ОГЛАВЛЕНИЕ


Погрешность округления

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

И так не очень хорошо то, что вам приходится использовать приблизительное число, но все гораздо хуже. Практически в каждой арифметической операции в вашей программе результат данной операции также не будет представлен в числовом формате. Поверх первичной ошибки округления, практически каждая арифметическая операция имеет свою погрешность ei. К примеру, сложение двух чисел a и b, в результате даст число (a + b) + (ea + eb + esum), где ea, eb, и esum являются ошибками округления a, b, и результата соответственно. Ошибка округления растет, увеличивается с каждой операцией. К счастью, ошибки округления могут взаимно уничтожить друг друга в какой-то степени, но очень редко это происходит полностью. Некоторые операции также могут быть подвержены большей ошибке, чем другие.

Вторая часть данной серии статей будет иметь гораздо больше информации про погрешности округления и способы минимизации их эффекта.

Стандарты и арифметические операции с плавающей запятой

В 60-х и 70-х годах, компьютеры все еще были новинкой и стоили немало. Каждый производитель имел свою технологию процессоров, со своими численными форматами, своими правилами обработки переполнений и деления на ноль, своими правилами округления. Все было похоже на тотальную анархию.

К счастью, с появлением персонального компьютера все изменилось. К середине 80-х годов появился стандарт, который привнес некоторый порядок- стандарт IEEE-754 для двоичных арифметических устройств с плавающей запятой. Intel использовал это в разработке числового сопроцессора 8087. Некоторые признаки старой анархии все еще существовали некоторое время. Microsoft продолжала использовать свой бинарный формат ('Microsoft Binary Format') для чисел с плавающей точкой в своих интерпретаторах BASIC вплоть до представления QuickBasic 3.0.

Стандарт IEEE-754 затем стал более известен как "IEC 60559:1989, стандарт формата представления чисел с плавающей запятой для микропроцессоров". Он является официальным стандартным образцом, используемым компанией Microsoft во всех нынешних спецификациях.

Стандарт IEC 60559 не просто определяет числовые форматы. Он устанавливает направляющие для множества аспектов арифметических операций с плавающей точкой. Многие из данных стандартов являются обязательными, а некоторые являются опциональными. В третьей части мы рассмотрим реализацию стандарта компании Microsoft в общеязыковой среде исполнения (Common Language Runtime) и почему она не полна. Пока мы сконцентрируемся на двух числовых форматах, поддерживаемых CLR: числа с плавающей точкой с одинарной и двойной точностью. Мы также рассмотрим расширенный форма, для которого стандарт IEC 60559 определяет минимальные спецификации, и которые используются для единиц с плавающей точкой на процессорах Intel, а также используются в CLR.