Что такое эпсилон в программировании
Перейти к содержимому

Что такое эпсилон в программировании

  • автор:

Single. Epsilon Поле

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

Представляет наименьшее положительное значение Single больше нуля. Это поле является константой.

public: float Epsilon = 1.401298E-45;
public const float Epsilon = 1.401298E-45;
val mutable Epsilon : single
Public Const Epsilon As Single = 1.401298E-45
Значение поля

Value = 1.401298E-45

Комментарии

Дополнительные сведения об этом API см. в разделе Дополнительные примечания API для Single.Epsilon.

Машинный эпсилон

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

a+b = a при b 0

Более того, для сложения не выполняется закон ассоциативности:

Действительно, пусть ε — максимальное плавающее число среди чисел, удовлетворяющих условию

(приведенные выше рассуждения показывают, что такие числа существуют). Тогда

поскольку левая часть неравенства равна единице, а правая строго больше единицы (это следует из максимальности числа ε).

Число ε часто называют машинным эпсилоном или, чуть менее корректно, машинным нулем, поскольку при прибавлении к единице оно ведет себя как ноль. Величина машинного эпсилона характеризует точность операций компьютера. Она примерно одинакова для всех современных компьютеров: большинство процессоров работают с восьмибайтовыми плавающими числами (тип double в Си), а арифметика плавающих чисел подчиняется строгим международным стандартам.

Оценим величину машинного эпсилона для типа double. Число 1.0 записывается в плавающей форме как

Порядок плавающего числа 1.0 равен нулю. При сложении 1.0 с числом ε производится выравнивание порядка путем многократного сдвига мантиссы числа ε вправо и увеличения его порядка на 1. Поскольку все разряды числа ε должны в результате выйти за пределы разрядной сетки, должно быть выполнено 53 сдвига. Порядок числа ε после этого должен стать равным порядку числа 1.0, т.е. нулю. Следовательно, изначально порядок числа ε должен быть равным -53:

где m — число в диапазоне от единицы до двух. Таким образом, величина машинного эпсилона составляет примерно

2 -53 10 -16

Приблизительно точность вычислений составляет 16 десятичных цифр. (Это также можно оценить следующим образом: 53 двоичных разряда составляют примерно 15.95 десятичных, поскольку 53/log210 53/3.321928 15.95.)

В случае четырехбайтовых плавающих чисел (тип float языка Си) точность вычислений составляет примерно 7 десятичных цифр. Это очень мало, поэтому тип float чрезвычайно редко применяется на практике. К тому же процессор сконструирован для работы с восьмибайтовыми вещественными числами, а при работе с четырехбайтовыми он все равно сначала приводит их к восьмибайтовому типу. В программировании следует избегать типа float и всегда пользоваться типом double.

Некоторые процессоры применяют внутреннее представление плавающих чисел с большим количеством разрядов мантиссы. Например, процессор Intel использует 80-битовое (десятибайтовое) представление. Поэтому точность вычислений, которые не записывают промежуточные результаты в память, может быть несколько выше указанных оценок.

Кроме потери точности, при операциях с вещественными числами могут происходить и другие неприятности:

  1. переполнение — когда порядок результата больше максимально возможного значения. Эта ошибка часто возникает при умножении больших чисел;
  2. исчезновение порядка — когда порядок результата отрицательный и слишком большой по абсолютной величине, т.е. порядок меньше минимально допустимого значения. Эта ошибка может возникнуть при делении маленького числа на очень большое или при умножении двух очень маленьких по абсолютной величине чисел.

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

  1. бесконечно большое число — это плавающее число с очень большим положительным порядком и, таким образом, очень большое по абсолютной величине. Оно может иметь знак плюс или минус;
  2. бесконечно малое, или денормализованное, число — это ненулевое плавающее число с очень большим отрицательным порядком (т.е. очень маленькое по абсолютной величине);
  3. Not a Number, или NaN — двоичный код, который не является корректным представлением какого-либо вещественного числа.

Любые операции с константой NaN приводят к прерыванию, поэтому она удобна при отладке программы — ею перед началом работы программы инициализируются значения всех вещественных переменных. Если в результате ошибки программиста при вычислении выражения используется переменная, которой не было присвоено никакого значения, то происходит прерывание из-за операции со значением NaN и ошибка быстро отслеживается. К сожалению, в случае целых чисел такой константы нет: любой двоичный код представляет некоторое целое число.

Машинное эпсилон

Машинный ноль (англ. computer zero ) — представление нуля в вычислительной системе. Машинным нулём обозначаются числа, абсолютная величина которых меньше наименьшей ненулевой величины из диапазона изменения чисел данной вычислительной системы. [1]

Проблема машинного нуля в том, что два числа считаются одинаковыми, если они отличаются на величину, меньшую по модулю, чем машинный ноль.

При представлении чисел со знаком в обратных двоичных кодах существуют проблема наличия двух обратных кодов числа 0: «положительный нуль» и «отрицательный нуль».

См. также

Ссылки

Wikimedia Foundation . 2010 .

  • Машинное творчество
  • Машинный Крестовый Поход

Полезное

Смотреть что такое «Машинное эпсилон» в других словарях:

  • Машинный эпсилон — Плавающая запятая форма представления дробных чисел, в которой число хранится в форме мантиссы и показателя степени. При этом число с плавающей запятой имеет фиксированную относительную точность и изменяющуюся абсолютную. Наиболее часто… … Википедия
  • Числа с плавающей запятой — Плавающая запятая форма представления действительных чисел, в которой число хранится в форме мантиссы и показателя степени. При этом число с плавающей запятой имеет фиксированную относительную точность и изменяющуюся абсолютную. Наиболее… … Википедия
  • Число с плавающей запятой — Число с плавающей запятой форма представления действительных чисел, в которой число хранится в форме мантиссы и показателя степени. При этом число с плавающей запятой имеет фиксированную относительную точность и изменяющуюся абсолютную.… … Википедия
  • Запятая плавающая — Плавающая запятая форма представления дробных чисел, в которой число хранится в форме мантиссы и показателя степени. При этом число с плавающей запятой имеет фиксированную относительную точность и изменяющуюся абсолютную. Наиболее часто… … Википедия
  • Плавающая запятая — форма представления дробных чисел, в которой число хранится в форме мантиссы и показателя степени. При этом число с плавающей запятой имеет фиксированную относительную точность и изменяющуюся абсолютную. Наиболее часто используемое представление… … Википедия
  • Плавающая точка — Плавающая запятая форма представления дробных чисел, в которой число хранится в форме мантиссы и показателя степени. При этом число с плавающей запятой имеет фиксированную относительную точность и изменяющуюся абсолютную. Наиболее часто… … Википедия
  • Числа с плавающей точкой — Плавающая запятая форма представления дробных чисел, в которой число хранится в форме мантиссы и показателя степени. При этом число с плавающей запятой имеет фиксированную относительную точность и изменяющуюся абсолютную. Наиболее часто… … Википедия
  • Обратная связь: Техподдержка, Реклама на сайте
  • �� Путешествия

Экспорт словарей на сайты, сделанные на PHP,
WordPress, MODx.

  • Пометить текст и поделитьсяИскать в этом же словареИскать синонимы
  • Искать во всех словарях
  • Искать в переводах
  • Искать в ИнтернетеИскать в этой же категории

Машинный ноль

Информация должна быть проверяема, иначе она может быть поставлена под сомнение и удалена.
Вы можете отредактировать эту статью, добавив ссылки на авторитетные источники.

  • Проверить достоверность указанной в статье информации.

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

Машинный ноль (Машинный нуль) — числовое значение с таким отрицательным порядком, которое воспринимается машиной как ноль.

Машинный эпсилон (англ. Machine epsilon ) — числовое значение, меньше которого невозможно задавать точность для любого алгоритма, возвращающего вещественные числа. Абсолютное значение «машинного эпсилон» зависит от разрядности сетки применяемой ЭВМ, от принятой в конкретном трансляторе точности представления вещественных чисел и от значений, используемых для оценки точности. [1]

В языке Си существуют предельные константы FLT_EPSILON и DBL_EPSILON называемые «машинными эпсилон» относительно вещественного значения 1.0. FLT_EPSILON — максимальное значение типа float и имеет значение 1.2E-7, DBL_EPSILON — максимальное значение типа double и имеет значение 2.2E-16. Сумма каждого из этих значений со значением 1.0 не отличается от 1.0.

Проблема машинного эпсилон в том, что два числа считаются одинаковыми, если они отличаются на величину, меньшую по модулю, чем машинный эпсилон. [источник не указан 4819 дней]

Пример [ править ]

Пример вычисления машинного эпсилона (не путать с машинным нулём) на языке Си.

float macheps(void)  float e = 1.0f; while (1.0f + e / 2.0f > 1.0f) e /= 2.0f; return e; > 

Пример на языке C++.

# include # include # include templatetypename float_t, typename int_t> float_t machine_eps()  union  float_t f; int_t i; > one, one_plus, little, last_little; one.f = 1.0; little.f = 1.0; last_little.f = little.f; while(true)  one_plus.f = one.f; one_plus.f += little.f; if( one.i != one_plus.i )  last_little.f = little.f; little.f /= 2.0; > else  return last_little.f; > > > int main()  std::cout  <"machine epsilon:\n"; std::cout  <"float: "  <std::setprecision(18) <machine_epsfloat, uint32_t>()  <std::endl; std::cout  <"double: "  <std::setprecision(18)  <machine_epsdouble, uint64_t>()  <std::endl; > 
def machineEpsilon(func=float): machine_epsilon = func(1) while func(1)+func(machine_epsilon) != func(1): machine_epsilon_last = machine_epsilon machine_epsilon = func(machine_epsilon) / func(2) return machine_epsilon_last 

Вывод может быть таким (с использованием IPython):

In [1]: machineEpsilon(int) Out[1]: 1
In [2]: machineEpsilon(float) Out[2]: 2.2204460492503131e-16
In [3]: machineEpsilon(complex) Out[3]: (2.2204460492503131e-16+0j)

См. также [ править ]

Примечания [ править ]

  1. ↑ Подбельский В. В., Фомин С. С. Программирование по на языке Си: Учеб.пособие. Москва: Изд-во Финансы и статистика, 2003.
Компьютер Это заготовка статьи о компьютерах. Вы можете помочь проекту, дополнив её.
Это примечание по возможности следует заменить более точным.
  • Википедия:Статьи, достоверность которых требует проверки
  • Википедия:Нет источников с ноября 2010
  • Википедия:Статьи с утверждениями без источников более 14 дней
  • Незавершённые статьи о компьютерах
  • Незавершённые статьи, требующие уточнения шаблона
  • Компьютерная арифметика

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *